Merge branch '2.11.0-dev' into 2.11.0-wmj

# Conflicts:
#	OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java
#	OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java
#	OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java
#	OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java
This commit is contained in:
pangfan
2022-09-22 18:25:54 +08:00
118 changed files with 3284 additions and 1729 deletions

View File

@@ -51,6 +51,7 @@ dependencies {
implementation rootProject.ext.dependencies.rxjava
implementation rootProject.ext.dependencies.rxandroid
compileOnly rootProject.ext.dependencies.recyclerviewadapterhelper
implementation project(":OCH:mogo-och-common-module")

View File

@@ -13,7 +13,7 @@
<activity android:name=".ui.BusSwitchLineActivity"
android:theme="@style/SwitchLineDialogStyle"
android:launchMode="singleTask"
android:screenOrientation="landscape" />/>
android:screenOrientation="landscape" />
</application>
</manifest>

View File

@@ -1,20 +0,0 @@
package com.mogo.och.bus.bean;
import com.mogo.eagle.core.data.BaseData;
/**
* @author congtaowang
* @since 2021/3/22
*
* 小巴车运营状态返回参数
*/
public class BusOperationStatusResponse extends BaseData {
public Result data;
public static class Result {
public int serviceStatus;//0:已收车1:已出车
}
}

View File

@@ -0,0 +1,19 @@
package com.mogo.och.bus.bean;
import com.mogo.eagle.core.data.BaseData;
import java.util.List;
/**
* @author: wangmingjun
* @date: 2022/2/9
*/
public class BusQueryLineTaskResponse extends BaseData {
public List<Result> data;
public static class Result {
public int id;
public long taskStartTime;
}
}

View File

@@ -19,5 +19,9 @@ public class BusQueryLinesResponse extends BaseData {
public String startSiteName;//始发站名称
public String endSiteName;//终点名称
public boolean open;//true 打开状态 false
public boolean haveTask;
public List<BusQueryLineTaskResponse.Result> taskList;
}
}

View File

@@ -9,10 +9,10 @@ import com.mogo.commons.network.Utils;
*/
public class BusResetDrivingLineRequest {
public String sn;
public int lineId; //切换到的线路id
public int taskId; //切换到的线路id
public BusResetDrivingLineRequest(int lineId) {
sn = MoGoAiCloudClientConfig.getInstance().getSn();
this.lineId = lineId;
public BusResetDrivingLineRequest(int taskId) {
this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
this.taskId = taskId;
}
}

View File

@@ -1,5 +1,6 @@
package com.mogo.och.bus.callback;
import com.mogo.och.bus.bean.BusQueryLineTaskResponse;
import com.mogo.och.bus.bean.BusQueryLinesResponse;
/**
@@ -9,4 +10,5 @@ import com.mogo.och.bus.bean.BusQueryLinesResponse;
public interface IBusLinesCallback {
void onBusLinesChange(BusQueryLinesResponse lines);
void onChangeLineIdSuccess();
void onBusLineTasks(BusQueryLineTaskResponse o, int position);
}

View File

@@ -1,9 +0,0 @@
package com.mogo.och.bus.callback;
/**
* @author: wangmingjun
* @date: 2021/10/22
*/
public interface ICarOperationStatusCallback {
void changeOperationStatus(boolean changeStatus);
}

View File

@@ -14,6 +14,9 @@ public interface IRefreshBusStationsCallback {
int arrivingOrArrivedIndex,
boolean isArrived);
/**
* 结束清理一遍、选择任务后清理一遍
*/
void clearBusStationsMarkers();
void updateEmptyUi();

View File

@@ -0,0 +1,21 @@
package com.mogo.och.bus.constant
object LineAndTaskStatusManager {
var lineId: Int? = null//线路id
var taskId: Int? = null//任务id
@JvmStatic
fun setLineAndTaskId(lineId: Int?,taskId: Int?){
this.lineId = lineId
this.taskId = taskId
}
@JvmStatic
fun hasLineAndTaskId():Boolean{
if(lineId!=null&& taskId!=null){
return true
}else{
return false
}
}
}

View File

@@ -111,8 +111,6 @@ public abstract class BaseBusTabFragment<V extends IView, P extends Presenter<V>
return R.layout.bus_base_fragment;
}
private View panelView;
@Override
protected void initViews() {
groupTestPanel = findViewById(R.id.groupTestPanel);
@@ -131,7 +129,7 @@ public abstract class BaseBusTabFragment<V extends IView, P extends Presenter<V>
flSpeed = (FrameLayout) findViewById(R.id.fl_speed);
mTrafficDataView = (TrafficDataView) findViewById(R.id.bus_arc);
panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener);
mSwitchMapModeLayout = findViewById(R.id.bus_switch_model_layout);
@@ -287,10 +285,6 @@ public abstract class BaseBusTabFragment<V extends IView, P extends Presenter<V>
MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoMapListener(TYPE_ENTRANCE, this);
}
protected void onChangeOperationStatus() {
}
/**
* 展示滑动按钮
*
@@ -428,22 +422,6 @@ public abstract class BaseBusTabFragment<V extends IView, P extends Presenter<V>
});
}
public void hidPanel() {
getActivity().runOnUiThread(() -> {
flStationPanelContainer.setVisibility(View.GONE);
});
}
public void showPanel() {
getActivity().runOnUiThread(() -> {
flStationPanelContainer.setVisibility(View.VISIBLE);
});
}
public View getPanelView() {
return panelView;
}
public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
return null;
}

View File

@@ -3,17 +3,20 @@ package com.mogo.och.bus.fragment;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
import android.content.Intent;
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.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.voice.AIAssist;
import com.mogo.eagle.core.data.map.CenterLine;
import com.mogo.eagle.core.data.temp.EventBusOperation;
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.hmi.CallerHmiManager;
@@ -30,6 +33,8 @@ import com.mogo.och.bus.presenter.BusPresenter;
import com.mogo.och.bus.ui.BusStationCommonItem;
import com.mogo.och.bus.ui.BusSwitchLineActivity;
import com.mogo.och.bus.view.SlidePanelView;
import com.mogo.och.common.module.biz.constant.OchCommonConst;
import com.mogo.och.common.module.biz.provider.LoginService;
import com.mogo.och.common.module.utils.OCHThreadPoolManager;
import com.mogo.och.common.module.wigets.OCHCommitDialog;
@@ -60,11 +65,28 @@ public class BusFragment extends BaseBusTabFragment<BusFragment, BusPresenter>
private BusStationCommonItem secondStationItem;
private BusStationCommonItem thirdStationItem;
private LoginService loginService;
@Override
public String getTagName() {
return "BusFragment";
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation();
if(loginService!=null){
loginService.registerFragment(this, getPresenter());
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
loginService.unRegisterFragment();
loginService = null;
}
@Override
protected void initViews() {
super.initViews();
@@ -88,13 +110,9 @@ public class BusFragment extends BaseBusTabFragment<BusFragment, BusPresenter>
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onClickChangeOperationStatus(EventBusOperation eventBusOperation){
if (eventBusOperation.getId() == 0){ // 查询
mPresenter.queryOperationStatus();
}else if (eventBusOperation.getId() == 1){ // 出车/收车切换
CallerLogger.INSTANCE.d(M_BUS + TAG,"bus出车/收车");
onChangeOperationStatus();
}
public void changeOverview(EventLogout eventLogout){
CallerLogger.INSTANCE.d(M_BUS + TAG,"changeOverview Event消息去登出");
mPresenter.logout();
}
@Override
@@ -386,37 +404,6 @@ public class BusFragment extends BaseBusTabFragment<BusFragment, BusPresenter>
}
}
@Override
protected void onChangeOperationStatus() {
super.onChangeOperationStatus();
mPresenter.onChangeOperationStatus();
}
/**
* 修改经营状态
*
* @param launch true-收车false-出车
*/
public void changeOperationStatus(boolean launch) {
isOperationStatus = launch;
CallerHmiManager.INSTANCE.changeBusOperationStatus(launch);
if (launch) {
// 出车的时候重制站点状态
mPresenter.queryBusRoutes();
tvArrived.setVisibility(View.VISIBLE);
showPanel();
} else {
AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
tvArrived.setVisibility(View.GONE);
hideSlidePanel();
hidPanel();
//移除起点终点
clearBusStationsMarkers();
}
}
public void clearBusStationsMarkers(){
CallerLogger.INSTANCE.d(M_BUS + TAG,"clearBusStationsMarkers()");
if (null != startStation) {
@@ -521,7 +508,7 @@ public class BusFragment extends BaseBusTabFragment<BusFragment, BusPresenter>
@Override
public void cancel() {
closeLineConfirmDialog.dismiss();
}
});
closeLineConfirmDialog.show();

View File

@@ -4,12 +4,15 @@ import android.content.Context;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.eagle.core.utilcode.util.NetworkUtils;
import com.mogo.eagle.core.utilcode.util.SharedPrefs;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.och.bus.bean.BusQueryLineTaskResponse;
import com.mogo.och.bus.bean.BusQueryLinesResponse;
import com.mogo.och.bus.bean.BusRoutesResponse;
import com.mogo.och.bus.callback.IBusLinesCallback;
import com.mogo.och.bus.net.BusServiceManager;
import com.mogo.och.bus.net.IBusServiceCallback;
import com.mogo.och.bus.ui.BusSwitchLineActivity;
/**
* @author: wangmingjun
@@ -63,10 +66,41 @@ public class BusLineModel {
});
}
public void commitSwitchLineId(int lineId){
BusServiceManager.getInstance().switchLine(mContext,lineId, new IBusServiceCallback<BusRoutesResponse>() {
/**
* 通过线路id 查询线路排班表
* @param lineId
* @param position 位置
*/
public void queryBusLineTasksById(int lineId, int position){
BusServiceManager.getInstance().queryBusTaskByLineId(mContext, String.valueOf(lineId),new IBusServiceCallback<BusQueryLineTaskResponse>() {
@Override
public void onSuccess(BusQueryLineTaskResponse data) {
if (null == data && mBusLinesCallback != null) {
mBusLinesCallback.onBusLineTasks(null,position);
return;
}
if (mBusLinesCallback != null){
mBusLinesCallback.onBusLineTasks(data,position);
}
}
@Override
public void onFail(String failMsg) {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort("网络异常,请稍后重试");
}else {
ToastUtils.showShort("查询所有绑定路线失败:"+failMsg);
}
}
});
}
public void commitSwitchLineId(int taskId,int lineId){
BusServiceManager.getInstance().switchLine(mContext,taskId, new IBusServiceCallback<BusRoutesResponse>() {
@Override
public void onSuccess(BusRoutesResponse o) {
SharedPrefs.getInstance(mContext).putInt(BusSwitchLineActivity.LASTCOMMITLINEID,lineId);
if (mBusLinesCallback != null){
mBusLinesCallback.onChangeLineIdSuccess();
}

View File

@@ -15,6 +15,7 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.alibaba.android.arouter.launcher.ARouter;
import com.amap.api.maps.model.LatLng;
import com.elegant.network.utils.GsonUtil;
import com.mogo.cloud.commons.utils.CoordinateUtils;
@@ -30,13 +31,11 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
import com.mogo.eagle.core.utilcode.util.NetworkUtils;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.map.navi.IMogoCarLocationChangedListener2;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.och.bus.bean.BusOperationStatusResponse;
import com.mogo.och.bus.bean.BusOrderBean;
import com.mogo.och.bus.bean.BusOrdersResponse;
import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean;
@@ -44,7 +43,6 @@ import com.mogo.och.bus.bean.BusRoutesResponse;
import com.mogo.och.bus.bean.BusRoutesResult;
import com.mogo.och.bus.bean.BusStationBean;
import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
import com.mogo.och.bus.callback.ICarOperationStatusCallback;
import com.mogo.och.bus.callback.IBusControllerStatusCallback;
import com.mogo.och.bus.callback.IRefreshBusStationsCallback;
import com.mogo.och.bus.callback.ISlidePannelHideCallback;
@@ -54,6 +52,8 @@ import com.mogo.och.bus.net.IBusServiceCallback;
import com.mogo.och.bus.presenter.BusModelLoopManager;
import com.mogo.och.bus.util.BusAnalyticsManager;
import com.mogo.och.bus.util.BusTrajectoryManager;
import com.mogo.och.common.module.biz.constant.OchCommonConst;
import com.mogo.och.common.module.biz.provider.LoginService;
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil;
import com.mogo.och.common.module.utils.DateTimeUtil;
import com.mogo.och.common.module.utils.PinYinUtil;
@@ -86,10 +86,7 @@ public class BusOrderModel {
private final String TAG = BusOrderModel.class.getSimpleName();
private int currentLineId = -1;
private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引
/**
* 运营状态、后端更具运营状态来判断车辆是否派单
*/
private boolean mIsWorking = false;
private static volatile BusOrderModel sInstance;
public double mLongitude = 0;
public double mLatitude = 0;
@@ -107,7 +104,6 @@ public class BusOrderModel {
private static final int MSG_QUERY_BUS_STATION = 1001;
private static final long QUERY_BUS_STATION_DELAY = 5000;
private ICarOperationStatusCallback carOperationStatusCallback;
private IRefreshBusStationsCallback refreshBusStationsCallback;
private ISlidePannelHideCallback slidePannelHideCallback;
private IBusControllerStatusCallback mControllerStatusCallback; //Model->PresenterVR mode等
@@ -118,6 +114,8 @@ public class BusOrderModel {
private volatile boolean isArrivedStation = false;
private LoginService loginService;
private final Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
@@ -146,6 +144,7 @@ public class BusOrderModel {
public void init() {
mContext = AbsMogoApplication.getApp();
loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation();
// 2021/10/20 衡阳小巴业务使用LenovoPad时需要此app自己获取坐标并上传
String productFlavor = DebugConfig.getProductFlavor();
if (productFlavor != null && productFlavor.contains("fPadLenovoOchBus")) {
@@ -203,10 +202,6 @@ public class BusOrderModel {
startLoopBusOrders();
}
public void setCarOperationStatusCallback(ICarOperationStatusCallback callback){
this.carOperationStatusCallback = callback;
}
public void setRefreshBusStationsCallback(IRefreshBusStationsCallback callback){
this.refreshBusStationsCallback = callback;
}
@@ -354,6 +349,7 @@ public class BusOrderModel {
//自动驾驶路线规划接口
CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
loginService = null;
}
private Object readResolve() {
@@ -720,34 +716,10 @@ public class BusOrderModel {
});
}
/**
* 收车
*/
public void stopTakeOrder(){
BusServiceManager.getInstance().stopTakeOrder(mContext, new IBusServiceCallback<BaseData>() {
@Override
public void onSuccess(BaseData o) {
mIsWorking = !mIsWorking;
closeBeautificationMode();
carOperationStatusCallback.changeOperationStatus(isWorking());
startOrStopOrderLoop(mIsWorking);
BusTrajectoryManager.getInstance().stopTrajReqLoop();
}
@Override
public void onFail(String failMsg) {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort("网络异常,请稍后重试");
}else {
ToastUtils.showShort("收车失败:"+failMsg);
}
}
});
}
/**
* 关闭美化模式
*/
private void closeBeautificationMode() {
public void closeBeautificationMode() {
if (FunctionBuildConfig.isDemoMode) {//收车结束美化
FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(false);
@@ -756,60 +728,6 @@ public class BusOrderModel {
}
}
/**
* 出车
*/
public void startTakeOrder(){
BusServiceManager.getInstance().startTakeOrder(mContext, new IBusServiceCallback<BaseData>() {
@Override
public void onSuccess(BaseData o) {
mIsWorking = !mIsWorking;
startOrStopOrderLoop(mIsWorking);
if ( stationList != null && stationList.size() > 0 ) {
AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往"
+ stationList.get( backgroundCurrentStationIndex ).getName() + "站点" );
}
carOperationStatusCallback.changeOperationStatus(isWorking());
queryBusRoutes();
}
@Override
public void onFail(String failMsg) {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort("网络异常,请稍后重试");
}else {
ToastUtils.showShort("出车失败:"+failMsg);
}
}
});
}
/**
* 查询运营状态
*/
public void queryOperationStatus() {
CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态");
BusServiceManager.getInstance().queryOperationStatus(mContext
, new IBusServiceCallback<BusOperationStatusResponse>() {
@Override
public void onSuccess(BusOperationStatusResponse o) {
if ( o.data != null ) {
mIsWorking = o.data.serviceStatus == 1;
CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态 result.status: " + o.data.serviceStatus);
startOrStopOrderLoop(mIsWorking);
}
carOperationStatusCallback.changeOperationStatus(isWorking());
}
@Override
public void onFail(String failMsg) {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort("网络异常,请稍后重试");
}else {
ToastUtils.showShort("出车收车状态查询:"+failMsg);
}
}
});
}
/**
* 开启自动驾驶到下一站
*/
@@ -950,18 +868,6 @@ public class BusOrderModel {
AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() );
}
/**
* 修改小巴运营状态
*/
public void onChangeOperationStatus() {
CallerLogger.INSTANCE.d( M_BUS + TAG, "修改小巴运营状态");
if (isWorking()){//收车
stopTakeOrder();
}else {//出车
startTakeOrder();
}
}
/**
* 行程结束
*/
@@ -1003,10 +909,6 @@ public class BusOrderModel {
});
}
public boolean isWorking() {
return mIsWorking;
}
/**
* 到站
* @param data
@@ -1063,7 +965,7 @@ public class BusOrderModel {
});
}
private void startOrStopOrderLoop(boolean start) {
public void startOrStopOrderLoop(boolean start) {
CallerLogger.INSTANCE.d(M_BUS + TAG, "startOrStopOrderLoop() " + start);
if (start) {
BusModelLoopManager.getInstance().startHeartbeatLoop();
@@ -1072,6 +974,11 @@ public class BusOrderModel {
}
}
// 登出
public void logout() {
loginService.loginOut(mLatitude,mLongitude);
}
public void triggerStartServiceEvent(boolean isRestart, boolean send) {
if (stationList == null || backgroundCurrentStationIndex >= stationList.size()-1) {
return;

View File

@@ -11,12 +11,11 @@ import com.mogo.eagle.core.network.RequestOptions;
import com.mogo.eagle.core.network.SubscribeImpl;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.bus.bean.BusCloseTaskRequest;
import com.mogo.och.bus.bean.BusQueryLineTaskResponse;
import com.mogo.och.bus.bean.BusQueryLinesResponse;
import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean;
import com.mogo.och.bus.bean.BusRoutesResponse;
import com.mogo.och.bus.bean.CarHeartbeatReqBean;
import com.mogo.och.bus.bean.BusOperationStatusRequest;
import com.mogo.och.bus.bean.BusOperationStatusResponse;
import com.mogo.och.bus.bean.BusOrdersResponse;
import com.mogo.och.bus.bean.BusQueryLineStationsRequest;
import com.mogo.och.bus.bean.BusResetDrivingLineRequest;
@@ -72,12 +71,12 @@ public class BusServiceManager {
/**
* 重置线路站点
* @param context
* @param lineId
* @param taskId
* @param callback
*/
public void switchLine(Context context, int lineId, IBusServiceCallback<BusRoutesResponse> callback){
public void switchLine(Context context, int taskId, IBusServiceCallback<BusRoutesResponse> callback){
mService.switchLine(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(lineId))
,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(taskId))
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus"));
}
@@ -159,48 +158,7 @@ public class BusServiceManager {
.subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers"));
}
/**
* 收车
* @param context
* @param callback
*/
public void stopTakeOrder(Context context, IBusServiceCallback<BaseData> callback){
mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
,MoGoAiCloudClientConfig.getInstance().getToken()
,new BusOperationStatusRequest(BusOrderModel.getInstance().mLongitude
, BusOrderModel.getInstance().mLatitude))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context,callback,"stopTakeOrder"));
}
/**
* 出车
* @param context
* @param callback
*/
public void startTakeOrder(Context context, IBusServiceCallback<BaseData> callback){
mService.startTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
,MoGoAiCloudClientConfig.getInstance().getToken()
,new BusOperationStatusRequest(BusOrderModel.getInstance().mLongitude
, BusOrderModel.getInstance().mLatitude))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context,callback,"startTakeOrder"));
}
/**
* 查询出车/收车状态
* @param context
* @param callback
*/
public void queryOperationStatus(Context context, IBusServiceCallback<BusOperationStatusResponse> callback){
mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() )
.subscribe(getSubscribeImpl(context,callback,"queryOperationStatus"));
}
/**
* 查询小巴车订单
@@ -224,6 +182,15 @@ public class BusServiceManager {
.subscribe(getSubscribeImpl(context,callback,"queryBusLines"));
}
public void queryBusTaskByLineId(Context context,String lineId,IBusServiceCallback<BusQueryLineTaskResponse> callback){
mService.queryBusTaskByLineId(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
,MoGoAiCloudClientConfig.getInstance().getToken()
,lineId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context,callback,"queryBusLines"));
}
public void updateOrderRoute(Context context,int lineId, int startSiteId, int endSiteId
, List< BusRoutePlanningUpdateReqBean.Result > points
, IBusServiceCallback<BaseData> callback){

View File

@@ -3,12 +3,12 @@ import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.bus.bean.BusCloseTaskRequest;
import com.mogo.och.bus.bean.BusOperationStatusRequest;
import com.mogo.och.bus.bean.BusOrdersResponse;
import com.mogo.och.bus.bean.BusQueryLineTaskResponse;
import com.mogo.och.bus.bean.BusQueryLinesResponse;
import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean;
import com.mogo.och.bus.bean.BusRoutesResponse;
import com.mogo.och.bus.bean.CarHeartbeatReqBean;
import com.mogo.och.bus.bean.BusQueryLineStationsRequest;
import com.mogo.och.bus.bean.BusOperationStatusResponse;
import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest;
import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
import com.mogo.och.bus.bean.BusResetDrivingLineRequest;
@@ -45,11 +45,10 @@ public interface IBusApiService {
/**
* @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的 不是重置线路中站点的
* @return 返回值是重置后的车站列表
* 开始路线
*/
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/car/v2/bus/drivingLine/reset" )
@POST( "/autopilot-car-hailing/car/v2/driver/bus/drivingLine/reset" )
// @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" )
@POST( "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startTask" )
Observable<BusRoutesResponse> switchLine(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetDrivingLineRequest request);
/**
@@ -88,39 +87,6 @@ public interface IBusApiService {
// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/siteArrivedOrders")
Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Header ("appId") String appId,@Header("ticket") String ticket,@Body QueryLeaveAwayPassengersRequest request);
/**
* 出车
* @param request
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST("/autopilot-car-hailing/car/v2/bus/startTakeOrder")
@POST("/autopilot-car-hailing/car/v2/driver/bus/startTakeOrder")
// @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder")
Observable<BaseData> startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusOperationStatusRequest request);
/**
* 收车
* @param request
* @return
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
// @POST("/autopilot-car-hailing/car/v2/bus/stopTakeOrder")
@POST("/autopilot-car-hailing/car/v2/driver/bus/stopTakeOrder")
// @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder")
Observable<BaseData> stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusOperationStatusRequest request);
/**
* 查询小巴出车/收车状态
* @param sn
* @return
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
// @GET("/autopilot-car-hailing/car/v2/bus/takeOrderStatus/query")
@GET("/autopilot-car-hailing/car/v2/driver/bus/takeOrderStatus/query")
// @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query")
Observable<BusOperationStatusResponse> queryOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
@Headers({"Content-type:application/json;charset=UTF-8"})
// @GET("/autopilot-car-hailing/order/v2/bus/servicingOrders/query")
@GET("/autopilot-car-hailing/order/v2/driver/bus/servicingOrders/query")
@@ -144,10 +110,20 @@ public interface IBusApiService {
* @param sn
* @return
*/
// @GET("/autopilot-car-hailing/line/v2/driver/bindLine/query")
@GET("/autopilot-car-hailing/line/v2/driver/bus/bindLine/query")
Observable<BusQueryLinesResponse> queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
/**
* 查询路线当天的任务
* @param appId
* @param ticket
* @param lineId 线路id
* @return
*/
@GET("/autopilot-car-hailing/line/v2/driver/bus/task/query")
Observable<BusQueryLineTaskResponse> queryBusTaskByLineId(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("lineId") String lineId);
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/location/v2/driver/bus/saveLineCoordinate" )
Observable<BaseData> updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data);
@@ -165,6 +141,8 @@ public interface IBusApiService {
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask")
Observable<BusRoutesResponse> resetCurrentLineStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetLineStatusRequest data);
@POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask")
Observable<BaseData> abortTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data);
/**

View File

@@ -7,18 +7,26 @@ import androidx.lifecycle.LifecycleOwner;
import com.mogo.commons.mvp.Presenter;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.bus.bean.BusQueryLineTaskResponse;
import com.mogo.och.bus.bean.BusQueryLinesResponse;
import com.mogo.och.bus.callback.IBusLinesCallback;
import com.mogo.och.bus.model.BusLineModel;
import com.mogo.och.bus.model.BusOrderModel;
import com.mogo.och.bus.ui.BusSwitchLineView;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.disposables.Disposable;
/**
* @author: wangmingjun
* @date: 2022/2/9
*/
public class BusLinePresenter extends Presenter<BusSwitchLineView> implements IBusLinesCallback {
private Disposable subscribe;
public BusLinePresenter(BusSwitchLineView view) {
super(view);
BusLineModel.getInstance().init();
@@ -61,8 +69,21 @@ public class BusLinePresenter extends Presenter<BusSwitchLineView> implements IB
BusLineModel.getInstance().queryBusLines();
}
public void commitSwitchLineId(int lineId){
BusLineModel.getInstance().commitSwitchLineId(lineId);
public void queryBusLineTasks(int lineId, int position,boolean close){
if(subscribe!=null&&!subscribe.isDisposed()){
subscribe.dispose();
}
if(close){
return;
}
BusLineModel.getInstance().queryBusLineTasksById(lineId,position);
subscribe = Observable.interval(5, TimeUnit.SECONDS).subscribe(aLong -> {
BusLineModel.getInstance().queryBusLineTasksById(lineId,position);
});
}
public void commitSwitchLineId(int taskId,int lineId){
BusLineModel.getInstance().commitSwitchLineId(taskId,lineId);
}
public void removeListener(){
@@ -76,5 +97,14 @@ public class BusLinePresenter extends Presenter<BusSwitchLineView> implements IB
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);
if(subscribe!=null&&!subscribe.isDisposed()){
subscribe.dispose();
}
}
@Override
public void onBusLineTasks(BusQueryLineTaskResponse o, int position) {
mView.onBusLineTasks(o,position);
}
}

View File

@@ -17,13 +17,16 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.bus.bean.BusStationBean;
import com.mogo.och.bus.callback.ICarOperationStatusCallback;
import com.mogo.och.bus.callback.IBusControllerStatusCallback;
import com.mogo.och.bus.callback.IRefreshBusStationsCallback;
import com.mogo.och.bus.callback.ISlidePannelHideCallback;
import com.mogo.och.bus.constant.LineAndTaskStatusManager;
import com.mogo.och.bus.fragment.BusFragment;
import com.mogo.och.bus.model.BusOrderModel;
import com.mogo.och.bus.util.BusTrajectoryManager;
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
import com.mogo.och.common.module.biz.callback.ILoginCallback;
import com.zhidao.socket.utils.LoginStatusUtil;
import org.jetbrains.annotations.NotNull;
@@ -40,8 +43,8 @@ import system_master.SystemStatusInfo;
* @author tongchenfei
*/
public class BusPresenter extends Presenter<BusFragment>
implements ICarOperationStatusCallback, IRefreshBusStationsCallback, ISlidePannelHideCallback
, IMoGoAutopilotStatusListener, IBusControllerStatusCallback {
implements IRefreshBusStationsCallback, ISlidePannelHideCallback
, IMoGoAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback {
private static final String TAG = "BusPresenter";
@@ -60,7 +63,6 @@ public class BusPresenter extends Presenter<BusFragment>
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
super.onCreate(owner);
queryOperationStatus();
BusOrderModel.getInstance().queryBusRoutes();
initModelListener();
}
@@ -73,14 +75,12 @@ public class BusPresenter extends Presenter<BusFragment>
}
public void initModelListener() {
BusOrderModel.getInstance().setCarOperationStatusCallback(this);
BusOrderModel.getInstance().setRefreshBusStationsCallback(this);
BusOrderModel.getInstance().setSlidePannelHideCallback(this);
BusOrderModel.getInstance().setControllerStatusCallback(this);
}
public void releaseListener() {
BusOrderModel.getInstance().setCarOperationStatusCallback(null);
BusOrderModel.getInstance().setRefreshBusStationsCallback(null);
BusOrderModel.getInstance().setSlidePannelHideCallback(null);
BusOrderModel.getInstance().setControllerStatusCallback(null);
@@ -90,6 +90,8 @@ public class BusPresenter extends Presenter<BusFragment>
BusOrderModel.getInstance().queryBusRoutes();
}
public void resetCurrentLineStatus() {
BusOrderModel.getInstance().resetCurrentLineStatus();
public void queryOperationStatus(){
BusOrderModel.getInstance().queryOperationStatus();
}
@@ -112,15 +114,9 @@ public class BusPresenter extends Presenter<BusFragment>
}
}
public void onChangeOperationStatus() {
BusOrderModel.getInstance().onChangeOperationStatus();
}
@Override
public void changeOperationStatus(boolean changeStatus) {
if (mView != null) {
runOnUIThread(() -> mView.changeOperationStatus(changeStatus));
}
// 登出
public void logout() {
BusOrderModel.getInstance().logout();
}
// @Override
@@ -318,5 +314,27 @@ public class BusPresenter extends Presenter<BusFragment>
@Override
public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) {
}
@Override
public void loginSuccess(DriverStatusQueryRespBean data) {
LineAndTaskStatusManager.setLineAndTaskId(data.data.lineId,data.data.taskId);
if(LoginStatusUtil.isLogin()){
BusOrderModel.getInstance().startOrStopOrderLoop(true);
}else {
BusTrajectoryManager.getInstance().stopTrajReqLoop();
BusOrderModel.getInstance().startOrStopOrderLoop(false);
BusTrajectoryManager.getInstance().stopTrajReqLoop();
clearBusStationsMarkers();
mView.hideSlidePanel();
BusOrderModel.getInstance().closeBeautificationMode();
}
if(LineAndTaskStatusManager.hasLineAndTaskId()){
BusOrderModel.getInstance().queryBusRoutes();
}
}
@Override
public void loginFail(boolean isLogin) {
}
}

View File

@@ -1,299 +0,0 @@
package com.mogo.och.bus.ui;
import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.mogo.commons.mvp.MvpActivity;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.och.bus.R;
import com.mogo.och.bus.bean.BusQueryLinesResponse;
import com.mogo.och.bus.presenter.BusLinePresenter;
import java.util.ArrayList;
import java.util.List;
/**
* @author: wangmingjun
* @date: 2022/2/8
*/
public class BusSwitchLineActivity extends MvpActivity<BusSwitchLineView, BusLinePresenter>
implements View.OnClickListener, BusSwitchLineView {
private ImageView mClose;
private ConstraintLayout mNoDatasView;
private RecyclerView mLinesListView;
private TextView mLineCommitBtn;
private SwitchLineAdapter mAdapter;
private List<BusQueryLinesResponse.Result> mData = new ArrayList<>();
private int mSelectLineId = -1;
@Override
protected int getLayoutId() {
return R.layout.activity_bus_switch_line;
}
@NonNull
@Override
protected BusLinePresenter createPresenter() {
return new BusLinePresenter(this);
}
@Override
protected void initViews() {
initWH();
initView();
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDatas();
}
/**
* 初始化view
*/
private void 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);
mLinesListView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new SwitchLineAdapter(getApplicationContext(),mData);
mLinesListView.setAdapter(mAdapter);
//设置item 点击事件
mAdapter.setOnLineItemClickListener(new LineItemClickListener() {
@Override
public void onItemClick(int position) {
if (mData.size() > position && !TextUtils.isEmpty(mData.get(position).startSiteName )
&& !TextUtils.isEmpty(mData.get(position).endSiteName)){
mSelectLineId = mData.get(position).lineId;
}else {
mSelectLineId = -1;
}
}
});
}
/**
* 设置布局宽高
*/
private void initWH() {
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
Point point = new Point();
windowManager.getDefaultDisplay().getSize(point);//用于获取屏幕高度
params.width = (int)(point.x * 0.375);
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
window.setAttributes(params);
window.setGravity(Gravity.LEFT|Gravity.BOTTOM);
}
/**
* 初始化数据
*/
private void initDatas() {
mPresenter.queryBusLines();
}
/**
* 查询返回绑定路线集合
* @param data
*/
@Override
public void onBusLinesChange(BusQueryLinesResponse data){
if (null == data){
showNoData(true);
return;
}
if (data.data != null && data.data.size() > 0){
showNoData(false);
mData.clear();
mData.addAll(data.data);
mAdapter.notifyDataSetChanged();
changeCommitBtnBg();
}else {
showNoData(true);
}
}
/**
* 根据路线选中情况设置提交按钮样式
*/
private void changeCommitBtnBg() {
for (int i=0; i<mData.size();i++){
if (mData.get(i).choose == 1){
mLineCommitBtn.setBackgroundResource(R.drawable.bus_switch_line_btn_commit);
mLineCommitBtn.setTextColor(getResources().getColor(R.color.bus_white));
return;
}
}
}
@Override
public void onChangeLineIdSuccess(){
ToastUtils.showLong(getResources().getString(R.string.bus_change_line_commit_tip_s));
mPresenter.queryBusRoutes();
if (mAdapter != null){
mAdapter.setOnLineItemClickListener(null);
}
mPresenter.removeListener();
finish();
}
/**
* 有无数据UI显示
* @param b
*/
private void showNoData(boolean b) {
if (b){
mLinesListView.setVisibility(View.GONE);
mLineCommitBtn.setVisibility(View.GONE);
mNoDatasView.setVisibility(View.VISIBLE);
}else {
mLinesListView.setVisibility(View.VISIBLE);
mLineCommitBtn.setVisibility(View.VISIBLE);
mNoDatasView.setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
//关闭dialog
if (v.getId() == R.id.switch_line_close){
finish();
return;
}
//切换路线提交
if (v.getId() == R.id.switch_line_btn_commit){
if (mSelectLineId > -1){
mPresenter.commitSwitchLineId(mSelectLineId);
}else {
finish();
}
return;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
/**
* 路线列表adapter
*/
static class SwitchLineAdapter extends RecyclerView.Adapter<SwitchLineViewHolder>{
private Context mContext;
private List<BusQueryLinesResponse.Result> mData;
// RecyclerView设置点击事件
private LineItemClickListener mItemClickListener ;
private int clickPos = -1;
public SwitchLineAdapter(Context context, List<BusQueryLinesResponse.Result> data){
mContext = context;
mData = data;
}
@NonNull
@Override
public SwitchLineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.bus_switch_line_list_item
,parent,false);
SwitchLineViewHolder viewHolder = new SwitchLineViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull SwitchLineViewHolder holder, int position) {
BusQueryLinesResponse.Result line = mData.get(position);
holder.lineName.setText(mContext.getString(R.string.bus_switch_line_name)+" "+line.name);
holder.lineStartName.setText(mContext.getString(R.string.bus_line_start)+" "+line.startSiteName);
holder.lineEndName.setText(mContext.getString(R.string.bus_line_end)+" "+line.endSiteName);
//设置item点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mItemClickListener != null){
mItemClickListener.onItemClick(position);
clickPos = position;
notifyDataSetChanged();
}
}
});
//选中绑定
if (clickPos > -1){
if (clickPos == position){
holder.selectIv.setImageResource(R.drawable.bus_selected_btn);
}else {
holder.selectIv.setImageResource(R.drawable.bus_unselect_btn);
}
}else {
if (line.choose == 1){//1:绑定 2:未绑定 默认绑定
if (mItemClickListener != null) {
mItemClickListener.onItemClick(position);
}
holder.selectIv.setImageResource(R.drawable.bus_selected_btn);
}else {
holder.selectIv.setImageResource(R.drawable.bus_unselect_btn);
}
}
}
@Override
public int getItemCount() {
return mData.size();
}
public void setOnLineItemClickListener(LineItemClickListener itemClickListener){
this.mItemClickListener = itemClickListener ;
}
}
static class SwitchLineViewHolder extends RecyclerView.ViewHolder{
private ImageView selectIv;
private TextView lineName; //线路名称
private TextView lineStartName; //起点
private TextView lineEndName; //终点
public SwitchLineViewHolder(@NonNull View itemView) {
super(itemView);
selectIv = itemView.findViewById(R.id.switch_line_item_select_iv);
lineName = itemView.findViewById(R.id.switch_line_name);
lineStartName = itemView.findViewById(R.id.switch_line_start_station);
lineEndName = itemView.findViewById(R.id.switch_line_end_station);
}
}
public interface LineItemClickListener {
void onItemClick(int position) ;
}
}

View File

@@ -0,0 +1,210 @@
package com.mogo.och.bus.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.eagle.core.utilcode.util.SharedPrefs
import com.mogo.och.bus.presenter.BusLinePresenter
import com.mogo.och.bus.ui.adapter.SwitchLineAdapter
import com.mogo.och.bus.bean.BusQueryLinesResponse
import com.mogo.och.bus.ui.adapter.OpenItemAnimator
import com.mogo.module.common.view.SpacesItemDecoration
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.R
import com.mogo.och.bus.bean.BusQueryLineTaskResponse
import java.util.ArrayList
/**
* @author: wangmingjun
* @date: 2022/2/8
*/
class BusSwitchLineActivity : MvpActivity<BusSwitchLineView?, BusLinePresenter?>(),
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<BusQueryLinesResponse.Result> = ArrayList()
override fun getLayoutId(): Int {
return R.layout.activity_bus_switch_line
}
override fun createPresenter(): BusLinePresenter {
return BusLinePresenter(this)
}
override fun initViews() {
initWH()
initView()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
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(position: Int, close: Boolean) {
mPresenter?.queryBusLineTasks(mData[position].lineId, position, close)
}
})
}
/**
* 设置布局宽高
*/
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: BusQueryLinesResponse?) {
if (null == data) {
showNoData(true)
return
}
var lastCommitLineid = SharedPrefs.getInstance(this).getInt(LASTCOMMITLINEID, -1)
if (data.data != null && data.data.size > 0) {
showNoData(false)
mData.clear()
mData.addAll(data.data)
mAdapter.notifyDataSetChanged()
if(lastCommitLineid>0){
mData.forEachIndexed { index, line ->
if(line.lineId==lastCommitLineid){
line.open = true
mPresenter?.queryBusLineTasks(line.lineId,index,false)
return
}
}
}
} 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()
}
override fun onBusLineTasks(lineTaskInfo: BusQueryLineTaskResponse?, position: Int) {
val result = mData[position]
if (result.taskList == null) {
result.taskList = ArrayList()
}
if (lineTaskInfo == null) {
result.haveTask = true
// 打开操作
mAdapter.notifyItemChanged(position)
} else {
if (lineTaskInfo.data == null || lineTaskInfo.data.isEmpty()) {
result.haveTask = true
lineTaskInfo.data = ArrayList()
}
if (lineTaskInfo.data.size != result.taskList.size) { // 不相等有变动 重新赋值
result.taskList.clear()
result.taskList.addAll(lineTaskInfo.data)
// 打开操作
mAdapter.notifyItemChanged(position)
if(position==mData.size-1||position==mData.size-2){
linearLayoutManager.stackFromEnd = true
}else{
linearLayoutManager.stackFromEnd = false
}
mLinesListView.scrollToPosition(position)
}
}
}
/**
* 有无数据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(mAdapter.checkLineId!=-1&&mAdapter.checkTaskId!=-1){
mPresenter?.commitSwitchLineId(mAdapter.checkTaskId,mAdapter.checkLineId)
}else{
ToastUtils.showLong("请选择时间")
}
}
}
override fun onDestroy() {
mPresenter!!.removeListener()
super.onDestroy()
}
}

View File

@@ -1,6 +1,7 @@
package com.mogo.och.bus.ui;
import com.mogo.commons.mvp.IView;
import com.mogo.och.bus.bean.BusQueryLineTaskResponse;
import com.mogo.och.bus.bean.BusQueryLinesResponse;
/**
@@ -11,5 +12,7 @@ public interface BusSwitchLineView extends IView {
void onBusLinesChange(BusQueryLinesResponse data);
void onChangeLineIdSuccess();
void onBusLineTasks(BusQueryLineTaskResponse o, int position);
}

View File

@@ -0,0 +1,655 @@
package com.mogo.och.bus.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 ArrayList<RecyclerView.ViewHolder> mPendingRemovals = new ArrayList<>();
private ArrayList<RecyclerView.ViewHolder> mPendingAdditions = new ArrayList<>();
private ArrayList<MoveInfo> mPendingMoves = new ArrayList<>();
private ArrayList<ChangeInfo> mPendingChanges = new ArrayList<>();
ArrayList<ArrayList<RecyclerView.ViewHolder>> mAdditionsList = new ArrayList<>();
ArrayList<ArrayList<MoveInfo>> mMovesList = new ArrayList<>();
ArrayList<ArrayList<ChangeInfo>> mChangesList = new ArrayList<>();
ArrayList<RecyclerView.ViewHolder> mAddAnimations = new ArrayList<>();
ArrayList<RecyclerView.ViewHolder> mMoveAnimations = new ArrayList<>();
ArrayList<RecyclerView.ViewHolder> mRemoveAnimations = new ArrayList<>();
ArrayList<RecyclerView.ViewHolder> 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<MoveInfo> moves = new ArrayList<>();
moves.addAll(mPendingMoves);
mMovesList.add(moves);
mPendingMoves.clear();
Runnable mover = new Runnable() {
@Override
public void run() {
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<ChangeInfo> changes = new ArrayList<>();
changes.addAll(mPendingChanges);
mChangesList.add(changes);
mPendingChanges.clear();
Runnable changer = new Runnable() {
@Override
public void run() {
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<RecyclerView.ViewHolder> additions = new ArrayList<>();
additions.addAll(mPendingAdditions);
mAdditionsList.add(additions);
mPendingAdditions.clear();
Runnable adder = new Runnable() {
@Override
public void run() {
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(changeInfo.toX - changeInfo.fromX);
oldViewAnim.translationY(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<ChangeInfo> 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<ChangeInfo> changes = mChangesList.get(i);
endChangeAnimation(changes, item);
if (changes.isEmpty()) {
mChangesList.remove(i);
}
}
for (int i = mMovesList.size() - 1; i >= 0; i--) {
ArrayList<MoveInfo> 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<RecyclerView.ViewHolder> 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<MoveInfo> 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<RecyclerView.ViewHolder> 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<ChangeInfo> 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<RecyclerView.ViewHolder> viewHolders) {
for (int i = viewHolders.size() - 1; i >= 0; i--) {
viewHolders.get(i).itemView.animate().cancel();
}
}
/**
* {@inheritDoc}
* <p>
* If the payload list is not empty, DefaultItemAnimator returns <code>true</code>.
* When this is the case:
* <ul>
* <li>If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both
* ViewHolder arguments will be the same instance.
* </li>
* <li>
* 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.
* </li>
* </ul>
*/
@Override
public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull List<Object> payloads) {
return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads);
}
}

View File

@@ -0,0 +1,157 @@
package com.mogo.och.bus.ui.adapter
import android.content.Context
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.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.mogo.och.bus.R
import com.mogo.och.bus.bean.BusQueryLinesResponse
import com.mogo.och.bus.ui.adapter.SwitchLineAdapter.SwitchLineViewHolder
/**
* 路线列表adapter
*/
class SwitchLineAdapter(
private val mContext: Context,
private val mData: List<BusQueryLinesResponse.Result>
) : RecyclerView.Adapter<SwitchLineViewHolder>() {
companion object{
const val TAG = "SwitchLineAdapter"
}
// RecyclerView设置点击事件
private var mItemClickListener: LineItemClickListener? = null
var checkLineId:Int = -1
var checkTaskId:Int = -1
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): SwitchLineViewHolder {
val view = LayoutInflater.from(mContext).inflate(
R.layout.bus_switch_line_list_item, parent, false
)
return SwitchLineViewHolder(view)
}
override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) {
val currentPosition = holder.bindingAdapterPosition
val line = mData[currentPosition]
holder.lineName.text = line.name
holder.lineEndName.text = mContext.getString(R.string.bus_line_goto_end, line.endSiteName)
holder.rvLineTask.layoutManager = GridLayoutManager(mContext, 3)
val switchLineTaskAdapter = SwitchLineTaskAdapter(
mContext,
checkTaskId,
line.taskList,
object : SwitchLineTaskAdapter.TaskItemClickListener {
override fun onItemClick(position: Int,isCheck:Boolean) {
if(isCheck) {
checkLineId = line.lineId
checkTaskId = line.taskList[position].id
}else{
checkLineId=-1
checkTaskId=-1
}
}
})
holder.rvLineTask.adapter = switchLineTaskAdapter
holder.rvLineTask.isFocusableInTouchMode = false
holder.actvShowMore.visibility = View.VISIBLE
if(line.open){
if(line.taskList==null||line.taskList.isEmpty()){
holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_no_task)
holder.vLineTask.visibility = View.GONE
holder.rvLineTask.visibility = View.GONE
holder.selectIv.visibility = View.INVISIBLE
holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal)
}else {
holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_select_task)
holder.vLineTask.visibility = View.VISIBLE
holder.rvLineTask.visibility = View.VISIBLE
holder.selectIv.visibility = View.VISIBLE
holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_selected)
holder.selectIv.apply {
pivotX = 9.5f
pivotY = 17f
rotation = 90f
}
}
}else{
if(line.haveTask){
holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_no_task)
holder.vLineTask.visibility = View.GONE
holder.rvLineTask.visibility = View.GONE
holder.selectIv.visibility = View.INVISIBLE
holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal)
}else {
holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_select_task)
holder.vLineTask.visibility = View.GONE
holder.rvLineTask.visibility = View.GONE
holder.selectIv.visibility = View.VISIBLE
holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal)
holder.selectIv.apply {
pivotX = 9.5f
pivotY = 17f
rotation = 0f
}
}
}
//设置item点击事件
holder.itemView.setOnClickListener {
if(holder.actvShowMore.text==mContext.getString(R.string.bus_switch_line_no_task)){
return@setOnClickListener
}
mData.forEachIndexed { index, result ->
if(result.open){
result.open = false;
notifyItemChanged(index)
if(result.taskList!=null) {
result.taskList.clear()
}
if(index==currentPosition){// 点击当前已经打开的item 去关闭定时网络请求
mItemClickListener?.onItemClick(currentPosition,true)
return@setOnClickListener
}
}
}
mItemClickListener?.onItemClick(currentPosition,false)
line.open = holder.rvLineTask.visibility == View.GONE
}
}
override fun getItemCount(): Int {
return mData.size
}
fun setOnLineItemClickListener(itemClickListener: LineItemClickListener?) {
mItemClickListener = itemClickListener
}
class SwitchLineViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val selectIv: ImageView
val lineName: AppCompatTextView//线路名称
val lineEndName: AppCompatTextView //终点
val actvShowMore: AppCompatTextView //选择时间
val rvLineTask: RecyclerView// 排班时间
val vLineTask: View// 白色分割线
init {
selectIv = itemView.findViewById(R.id.switch_line_item_select_iv)
lineName = itemView.findViewById(R.id.switch_line_name)
lineEndName = itemView.findViewById(R.id.switch_line_end_station)
rvLineTask = itemView.findViewById(R.id.rv_line_task_list)
vLineTask = itemView.findViewById(R.id.v_line_task)
actvShowMore = itemView.findViewById(R.id.actv_show_more)
}
}
interface LineItemClickListener {
fun onItemClick(position: Int,close:Boolean)
}
}

View File

@@ -0,0 +1,76 @@
package com.mogo.och.bus.ui.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.och.bus.R
import com.mogo.och.bus.bean.BusQueryLineTaskResponse
import com.mogo.och.bus.ui.adapter.SwitchLineTaskAdapter.SwitchLineTaskViewHolder
/**
* 路线列表adapter
*/
class SwitchLineTaskAdapter(
private val mContext: Context,
private var checkTaskId:Int,
private val mData: List<BusQueryLineTaskResponse.Result>?,
private val mTaskItemClickListener: TaskItemClickListener?
) : RecyclerView.Adapter<SwitchLineTaskViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwitchLineTaskViewHolder {
val view = LayoutInflater.from(mContext).inflate(
R.layout.bus_switch_line_list_task_item, parent, false
)
return SwitchLineTaskViewHolder(view)
}
override fun onBindViewHolder(holder: SwitchLineTaskViewHolder, position: Int) {
val currentPosition = holder.bindingAdapterPosition
val task = mData!![currentPosition]
val taskStartTime = TimeUtils.millis2String(task.taskStartTime, "HH:mm")
holder.lineTask.text = taskStartTime
if(checkTaskId==task.id){
holder.lineTask.setBackgroundResource(R.drawable.bus_shape_select_line_item_time_bg_selected)
}else{
holder.lineTask.setBackgroundResource(R.drawable.bus_shape_select_line_item_time_bg)
}
holder.lineTask.setOnClickListener {
if(checkTaskId==task.id){
checkTaskId = -1
mTaskItemClickListener?.onItemClick(currentPosition,false)
}else {
resetOther()
checkTaskId = task.id
mTaskItemClickListener?.onItemClick(currentPosition,true)
}
notifyItemChanged(currentPosition)
}
}
private fun resetOther() {
mData?.forEachIndexed { index, result ->
if(result.id==checkTaskId){
checkTaskId = -1
notifyItemChanged(index)
}
}
}
override fun getItemCount(): Int {
return mData?.size ?: 0
}
class SwitchLineTaskViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val lineTask: TextView // 时间
init {
lineTask = itemView.findViewById(R.id.actv_line_task)
}
}
interface TaskItemClickListener {
fun onItemClick(position: Int,isCheck:Boolean)
}
}

View File

@@ -6,10 +6,10 @@ import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
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.och.bus.bean.BusRoutesResult;
import com.mogo.och.bus.constant.BusConst;
import com.mogo.och.bus.model.BusOrderModel;
import com.zhidao.socket.utils.LoginStatusUtil;
import java.util.concurrent.TimeUnit;
@@ -50,7 +50,7 @@ public class BusTrajectoryManager {
*/
public void syncTrajectoryInfo() {
BusRoutesResult routesResult = BusOrderModel.getInstance().getBusRoutesResult();
if (BusOrderModel.getInstance().isWorking() && routesResult != null
if (LoginStatusUtil.isLogin() && routesResult != null
&& BusOrderModel.getInstance().getCurrentStationIndex() == 0
&& !BusOrderModel.getInstance().isGoingToNextStation()) {
CallerLogger.INSTANCE.d(M_BUS + TAG, "syncTrajectoryInfo() start.");

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:endColor="#660043FF"
android:startColor="#0028345E" />
</shape>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:endColor="#CC0043FF"
android:startColor="#0028345E" />
</shape>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:color="#A7B6F0" android:width="@dimen/dp_4"/>
<solid android:color="#1AA7B6F0" />
<corners android:radius="@dimen/dp_13"/>
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient android:startColor="#029DFF" android:endColor="#F00056FF"/>
<corners android:radius="@dimen/dp_13"/>
</shape>

View File

@@ -1,16 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="60px"/>
<gradient
android:angle="0"
android:type="linear"
android:startColor="#029DFF"
android:endColor="#0056FF" />
</shape>
</item>
</selector>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="24px" />
<gradient
android:angle="0"
android:endColor="#0056FF"
android:startColor="#029DFF"
android:type="linear" />
</shape>

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="60px"/>
<gradient
android:angle="0"
android:type="linear"
android:startColor="#11457C"
android:endColor="#102F7C" />
</shape>
</item>
</selector>

View File

@@ -3,6 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/bus_switch_line_bg">
<View
@@ -44,27 +45,24 @@
app:layout_constraintLeft_toLeftOf="@+id/switch_line_1"
app:layout_constraintTop_toBottomOf="@+id/switch_line_1"
app:layout_constraintBottom_toTopOf="@+id/switch_line_btn_commit"
android:requiresFadingEdge="vertical"
android:fadingEdgeLength="40dp"
android:layout_marginTop="@dimen/dp_50"
android:layout_marginLeft="@dimen/dp_80"
android:layout_marginRight="@dimen/dp_80"
android:layout_marginBottom="@dimen/dp_30"/>
<TextView
android:id="@+id/switch_line_btn_commit"
android:layout_width="@dimen/bus_switch_line_btn_width"
android:layout_height="@dimen/bus_switch_line_btn_height"
android:layout_width="match_parent"
android:layout_marginStart="@dimen/dp_80"
android:layout_marginEnd="@dimen/dp_80"
android:layout_height="126px"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginBottom="@dimen/bus_switch_line_btn_margin_b"
android:textSize="@dimen/dp_42"
android:textColor="@color/bus_switch_btn_bg_half"
android:textColor="@android:color/white"
android:text="@string/bus_switch_line_btn_txt"
android:visibility="gone"
android:gravity="center"
android:background="@drawable/bus_switch_line_btn_un_commit"/>
android:background="@drawable/bus_switch_line_btn_commit"/>
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -60,8 +60,7 @@
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="@dimen/dp_13"
app:layout_constraintTop_toBottomOf="@id/module_mogo_och_autopilot_status"
app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call"
android:visibility="gone"/>
app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call" />
<include
android:id="@+id/module_mogo_och_bus_test_bar"

View File

@@ -1,89 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/dp_80">
android:background="@drawable/bus_shape_select_line_item_bg_normal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_show_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_13"
android:text="选择时间"
android:textColor="@android:color/white"
android:textSize="@dimen/dp_40"
app:layout_constraintTop_toTopOf="@+id/switch_line_item_select_iv"
app:layout_constraintBottom_toBottomOf="@+id/switch_line_item_select_iv"
app:layout_constraintEnd_toStartOf="@+id/switch_line_item_select_iv" />
<ImageView
android:id="@+id/switch_line_item_select_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bus_checkbox_selector"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
android:layout_marginEnd="@dimen/dp_80"
android:background="@drawable/bus_line_task_arrow"
app:layout_constraintBottom_toTopOf="@+id/v_line_task"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/switch_line_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@+id/switch_line_item_select_iv"
android:layout_marginLeft="@dimen/dp_33"
android:maxLines="2"
android:layout_marginStart="@dimen/dp_80"
android:layout_marginTop="@dimen/dp_34"
android:ellipsize="end"
android:textStyle="bold"
android:maxLines="2"
android:textColor="@android:color/white"
android:text="@string/bus_switch_line_name"
android:textSize="@dimen/dp_42" />
android:textSize="@dimen/dp_46"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/bus_switch_line_name" />
<TextView
android:id="@+id/switch_line_start_station"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_17"
android:layout_marginTop="@dimen/dp_30"
android:ellipsize="end"
android:maxLines="2"
android:text="@string/bus_switch_line_start"
android:textColor="#B9C3E9"
android:textSize="@dimen/dp_36"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/switch_line_name"
app:layout_constraintLeft_toRightOf="@+id/switch_line_start_greenDot"/>
<ImageView
android:id="@+id/switch_line_start_greenDot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bus_icon_arrived_station"
app:layout_constraintBottom_toBottomOf="@+id/switch_line_start_station"
app:layout_constraintLeft_toLeftOf="@+id/switch_line_name"
app:layout_constraintTop_toTopOf="@+id/switch_line_start_station" />
<ImageView
android:id="@+id/switch_line_end_dotLine"
android:layout_width="wrap_content"
android:layout_height="0px"
android:scaleType="fitXY"
android:src="@drawable/bus_och_dot_line"
app:layout_constraintBottom_toTopOf="@+id/switch_line_end_blueDot"
app:layout_constraintLeft_toLeftOf="@+id/switch_line_start_greenDot"
app:layout_constraintRight_toRightOf="@+id/switch_line_start_greenDot"
app:layout_constraintTop_toBottomOf="@+id/switch_line_start_greenDot" />
<ImageView
android:id="@+id/switch_line_end_blueDot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bus_icon_arriving_station"
app:layout_constraintBottom_toBottomOf="@+id/switch_line_end_station"
app:layout_constraintLeft_toLeftOf="@+id/switch_line_name"
app:layout_constraintTop_toTopOf="@+id/switch_line_end_station" />
<TextView
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/switch_line_end_station"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_17"
android:layout_marginTop="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_35"
android:ellipsize="end"
android:maxLines="2"
android:text="@string/bus_switch_line_end"
android:textColor="#B9C3E9"
android:textColor="@color/bus_color_b9c3e9"
android:textSize="@dimen/dp_36"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/switch_line_end_blueDot"
app:layout_constraintTop_toBottomOf="@+id/switch_line_start_station"/>
app:layout_constraintBottom_toTopOf="@+id/v_line_task"
app:layout_constraintStart_toStartOf="@+id/switch_line_name"
app:layout_constraintTop_toBottomOf="@+id/switch_line_name"
tools:text="@string/bus_switch_line_end" />
<View
android:id="@+id/v_line_task"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginStart="@dimen/dp_80"
android:layout_marginEnd="@dimen/dp_80"
android:background="@android:color/white"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/rv_line_task_list"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/switch_line_end_station" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_line_task_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_50"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_50"
android:layout_marginBottom="@dimen/dp_20"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/v_line_task" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.AppCompatTextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/actv_line_task"
android:gravity="center"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_20"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginEnd="@dimen/dp_30"
android:background="@drawable/bus_shape_select_line_item_time_bg"
android:layout_width="match_parent"
android:textSize="@dimen/dp_40"
android:textColor="@android:color/white"
android:layout_height="@dimen/dp_102">
</androidx.appcompat.widget.AppCompatTextView>

View File

@@ -45,7 +45,9 @@
<color name="bus_traffic_light_yellow_color_up">#FFFFE198</color>
<color name="bus_traffic_light_yellow_color_down">#FFFF9B00</color>
<color name="bus_arrived_btn_un_clickable_color">#59FFFFFF</color>
<color name="bus_color_b9c3e9">#B9C3E9 </color>
<color name="bus_station_tag_txt_un_color">#8E9DD4</color>
<color name="bus_task_time_bg_color">#2B6EFF</color>
<color name="bus_line_station_color_selected">#00FFF8</color>

View File

@@ -5,7 +5,9 @@
<string name="bus_loading_autopilot_success_tv">启动成功</string>
<string name="bus_loading_autopilot_failure_tv">启动失败</string>
<string name="bus_loading_autopilot_runnig_tv">自动驾驶</string>
<string name="bus_switch_line_title">路线列表</string>
<string name="bus_switch_line_title">任务列表</string>
<string name="bus_switch_line_no_task">暂无任务</string>
<string name="bus_switch_line_select_task">选择时间</string>
<string name="bus_switch_line_name">路线: </string>
<string name="bus_switch_line_start">起点: </string>
<string name="bus_switch_line_end">终点:</string>
@@ -17,6 +19,7 @@
<string name="bus_no_line_tip">当前车辆无路线\n请联系运营人员绑定</string>
<string name="bus_line_start">起点: </string>
<string name="bus_line_end">终点: </string>
<string name="bus_line_goto_end">往%1$s方向</string>
<string name="bus_change_line_commit_tip_s">更换路线成功</string>
<string name="bus_change_line_commit_tip_f">更换路线失败</string>
<!-- <string name="bus_arrive_to_end_title">去往下车地点</string>-->

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<MotionScene
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:motion="http://schemas.android.com/apk/res-auto">
<Transition
motion:constraintSetEnd="@+id/end"
motion:constraintSetStart="@id/start"
motion:motionInterpolator="easeInOut"
motion:duration="300">
<KeyFrameSet>
</KeyFrameSet>
<OnClick motion:targetId="@+id/switch_line_item_select_iv" motion:clickAction="toggle" />
</Transition>
<ConstraintSet android:id="@+id/start">
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint
android:id="@+id/switch_line_end_station"
android:layout_width="0dp"
android:layout_height="wrap_content"
motion:layout_constraintBottom_toTopOf="@id/v_line_task"
android:layout_marginBottom="@dimen/dp_40"
motion:layout_constraintTop_toBottomOf="@+id/switch_line_name"
motion:layout_constraintStart_toStartOf="@+id/switch_line_name"
android:layout_marginTop="@dimen/dp_20" />
<Constraint
android:id="@+id/v_line_task"
android:visibility="visible"
android:background="@android:color/white"
android:layout_marginStart="@dimen/dp_80"
android:layout_marginEnd="@dimen/dp_80"
android:layout_marginTop="@dimen/dp_40"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintEnd_toEndOf="parent"
motion:layout_constraintTop_toBottomOf="@+id/switch_line_end_station"
android:layout_width="match_parent"
android:layout_height="1px"/>
<Constraint
android:id="@+id/rv_line_task_list"
android:visibility="visible"
android:layout_marginStart="@dimen/dp_80"
android:layout_marginEnd="@dimen/dp_80"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintEnd_toEndOf="parent"
motion:layout_constraintTop_toBottomOf="@+id/v_line_task"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ConstraintSet>
</MotionScene>

View File

@@ -1,6 +1,8 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.alibaba.arouter'
android {
compileSdkVersion 31
@@ -14,6 +16,22 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
//ARouter apt 参数
kapt {
useBuildCache = false
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildTypes {
@@ -34,6 +52,10 @@ dependencies {
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation rootProject.ext.dependencies.amapnavi3dmap
implementation rootProject.ext.dependencies.rxandroid
implementation rootProject.ext.dependencies.arouter
kapt rootProject.ext.dependencies.aroutercompiler
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
implementation rootProject.ext.dependencies.mogoutils

View File

@@ -0,0 +1,48 @@
package com.mogo.och.common.module.utils;
import com.mogo.cloud.network.OkHttpFactory;
import java.lang.reflect.Field;
import java.util.List;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
public class CollectionUtils {
public static void setInterceptor(){
OkHttpClient okHttpClient = OkHttpFactory.Companion.getOkHttpClient();
List<Interceptor> interceptors = okHttpClient.interceptors();
Field pro = getDeclaredField(interceptors, "list");
pro.setAccessible(true);
List<Interceptor> modifyerList = null;
try {
modifyerList = (List<Interceptor>) pro.get(interceptors);
modifyerList.add(new SimpleInterceptor());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
/**
* 获得名为field的字段
* @Description:如果本身找不到去父类寻找
* @param object
* @param fieldName
* @return Field
* @author luhao
* @since2019年2月26日 下午4:06:16
*/
public static Field getDeclaredField(Object object, String fieldName){
Field field = null ;
Class<?> clazz = object.getClass() ;
for(; clazz != Object.class ; clazz = clazz.getSuperclass()) {
try {
field = clazz.getDeclaredField(fieldName) ;
return field ;
} catch (Exception e) {
//这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
//如果这里的异常打印或者往外抛则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
}
}
return null;
}
}

View File

@@ -0,0 +1,75 @@
package com.mogo.och.common.module.utils
import android.util.Log
import okhttp3.*
class SimpleInterceptor: Interceptor {
var first = true;
override fun intercept(chain: Interceptor.Chain): Response {
val original = chain.request()
val encodedPath = original.url().encodedPath()
Log.e("SimpleInterceptor",original.method()+ encodedPath+original.url().encodedQuery())
when (encodedPath) {
"/autopilot-car-hailing/operation/v1/driver/bus/loginStatus" -> {
val builder = Response.Builder()
val create:ResponseBody
if(first) {
create = ResponseBody.create(
MediaType.parse("application/json"),
"{\"code\":0,\"msg\":\"\",\"data\":{\"servingStatus\":0,\"driverStatus\":1,\"orderNo\":\"12111\",\"purpose\":1,\"sn\":\"fjsdlfjslf\",\"plateNumber\":\"车牌号\",\"phone\":\"18811539480\",\"lineId\":\"线路id\",\"taskId\":\"任务id\"}}"
)
first = false
}else{
create = ResponseBody.create(
MediaType.parse("application/json"),
"{\"code\":0,\"msg\":\"\",\"data\":{\"servingStatus\":0,\"driverStatus\":0,\"orderNo\":\"12111\",\"purpose\":1,\"sn\":\"fjsdlfjslf\",\"plateNumber\":\"车牌号\",\"phone\":\"18811539480\",\"lineId\":\"线路id\",\"taskId\":\"任务id\"}}"
)
first = true
}
builder.code(200)
builder.request(original)
builder.protocol(Protocol.HTTP_1_1)
builder.message("")
return builder.body(create).build()
}
"/autopilot-car-hailing/line/v2/driver/bus/task/query" -> {
val builder = Response.Builder()
val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":[{\"id\":1,\"taskStartTime\":1663722000000},{\"id\":2,\"taskStartTime\":1663725600000},{\"id\":3,\"taskStartTime\":1663729200000},{\"id\":4,\"taskStartTime\":1663732800000},{\"id\":5,\"taskStartTime\":1663736400000},{\"id\":6,\"taskStartTime\":1663740000000},{\"id\":7,\"taskStartTime\":1663743600000},{\"id\":8,\"taskStartTime\":1663747200000},{\"id\":9,\"taskStartTime\":1663750800000},{\"id\":10,\"taskStartTime\":1663754400000}]}")
builder.code(200)
builder.request(original)
builder.protocol(Protocol.HTTP_1_1)
builder.message("")
return builder.body(create).build()
}
"/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startTask" -> {
val builder = Response.Builder()
val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":null}")
builder.code(200)
builder.request(original)
builder.protocol(Protocol.HTTP_1_1)
builder.message("")
return builder.body(create).build()
}
"/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endOperation" -> {
val builder = Response.Builder()
val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":null}")
builder.code(200)
builder.request(original)
builder.protocol(Protocol.HTTP_1_1)
builder.message("")
return builder.body(create).build()
}
"/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startOperation" -> {
val builder = Response.Builder()
val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":null}")
builder.code(200)
builder.request(original)
builder.protocol(Protocol.HTTP_1_1)
builder.message("")
return builder.body(create).build()
}
else -> {}
}
return chain.proceed(original)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.taxi.bean;
package com.mogo.och.common.module.biz.bean;
import com.mogo.eagle.core.data.BaseData;
@@ -15,5 +15,11 @@ public class DriverStatusQueryRespBean extends BaseData {
public int driverStatus; //1登录0登出
public String orderNo;
public int purpose; // 1 运营, 2 测试, 3演示
public String sn;
public String plateNumber;//车牌号
public String phone;//手机号
public Integer lineId;//线路id
public Integer taskId;//任务id
}
}

View File

@@ -1,8 +1,8 @@
package com.mogo.och.taxi.bean;
package com.mogo.och.common.module.biz.bean;
/**
* Created by pangfan on 2021/8/19
* 司机端准备好或者乘客已验证上车请求参数
* Created by yangyakun on 2021/8/19
* 通过手机号验证码登录
*/
public class TaxiLoginReqBean {

View File

@@ -1,14 +1,14 @@
package com.mogo.och.taxi.bean;
package com.mogo.och.common.module.biz.bean;
import com.mogo.eagle.core.data.BaseData;
/**
* Created by pangfan on 2021/8/19
* 司机端准备好或者乘客已验证上车请求参数
* Created by yangyakun on 2021/8/19
* 通过验证码登录
*/
public class TaxiLoginRespBean extends BaseData {
public TaxiLoginRespBean.Result data;
public Result data;
public static class Result {
public Double lat;

View File

@@ -1,8 +1,8 @@
package com.mogo.och.taxi.bean;
package com.mogo.och.common.module.biz.bean;
/**
* Created by pangfan on 2021/8/19
* 司机端准备好或者乘客已验证上车请求参数
* Created by yyk on 2021/8/19
* 获取验证码
*/
public class TaxiLoginSmsReqBean {

View File

@@ -1,8 +1,8 @@
package com.mogo.och.taxi.bean;
package com.mogo.och.common.module.biz.bean;
/**
* Created by pangfan on 2021/8/19
* 司机端准备好或者乘客已验证上车请求参数
* Created by yyk on 2021/8/19
* 登出请求参数
*/
public class TaxiLogoutReqBean {
public String sn;

View File

@@ -0,0 +1,9 @@
package com.mogo.och.common.module.biz.callback;
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
public interface ILoginCallback {
void loginSuccess(DriverStatusQueryRespBean data);
void loginFail(boolean isLogin);
}

View File

@@ -0,0 +1,13 @@
package com.mogo.och.common.module.biz.callback
interface ILoginViewCallback {
/**
* 展示登录页面
*/
fun showLoginDialogFragment()
/**
* 隐藏登录页面
*/
fun hideLoginDialogFragment()
}

View File

@@ -1,11 +1,4 @@
package com.mogo.och.taxi.callback;
import androidx.annotation.NonNull;
import com.mogo.och.taxi.bean.OrderQueryRespBean;
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
import java.util.List;
package com.mogo.och.common.module.biz.callback;
/**
* Created on 2021/9/8

View File

@@ -0,0 +1,38 @@
package com.mogo.och.common.module.biz.constant
object LoginStatusManager {
/**
* 登录状态
*/
private var loginStatus: TaxiLoginStatusEnum = TaxiLoginStatusEnum.None
@JvmStatic
fun setLoginStatus(status: Int) {
when (status) {
0 -> {
this.loginStatus = TaxiLoginStatusEnum.Logout
}
1 -> {
this.loginStatus = TaxiLoginStatusEnum.Login
}
else -> {
this.loginStatus = TaxiLoginStatusEnum.None
}
}
}
@JvmStatic
fun setLoginStatus(loginStatus: TaxiLoginStatusEnum) {
this.loginStatus = loginStatus
}
@JvmStatic
fun getLoginStatus(): TaxiLoginStatusEnum {
return loginStatus
}
@JvmStatic
fun isLogin():Boolean {
if(loginStatus== TaxiLoginStatusEnum.Login){
return true
}
return false
}
}

View File

@@ -0,0 +1,30 @@
package com.mogo.och.common.module.biz.constant
import com.mogo.commons.debug.DebugConfig
/**
* Created on 2021/12/6
*/
class OchCommonConst {
companion object {
private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com"
private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com"
@JvmStatic
fun getBaseUrl(): String {
return when (DebugConfig.getNetMode()) {
DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV
DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA
DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE
else -> BASE_URL_OCH_RELEASE
}
}
// token 失效 重新获取token
const val WAIT_TAKEN = 100046
const val LOGINSERVICE = "/ochbiz/common/login"
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.taxi.constant
package com.mogo.och.common.module.biz.constant
/**
* Created on 2022/08/19

View File

@@ -1,21 +1,21 @@
package com.mogo.och.taxi.model
package com.mogo.och.common.module.biz.model
import android.annotation.SuppressLint
import android.content.Context
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.utilcode.util.NetworkUtils
import com.mogo.och.taxi.model.TaxiLoginModel
import com.mogo.och.taxi.callback.ITaxiLoginCallback
import com.mogo.module.common.MogoApisHandler
import com.mogo.map.navi.IMogoCarLocationChangedListener2
import com.mogo.och.taxi.network.TaxiServiceManager
import com.mogo.och.taxi.network.TaxiServiceCallback
import com.mogo.eagle.core.utilcode.util.SharedPrefs
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.taxi.R
import com.mogo.och.taxi.bean.TaxiLoginReqBean
import com.mogo.och.taxi.bean.TaxiLoginRespBean
import com.mogo.och.taxi.constant.TaxiLoginStatusEnum
import com.mogo.och.taxi.utils.StatusManager
import com.mogo.map.navi.IMogoCarLocationChangedListener2
import com.mogo.module.common.MogoApisHandler
import com.mogo.och.common.module.R
import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean
import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean
import com.mogo.och.common.module.biz.callback.ITaxiLoginCallback
import com.mogo.och.common.module.biz.constant.TaxiLoginStatusEnum
import com.mogo.och.common.module.biz.constant.LoginStatusManager
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.biz.network.OchCommonServiceManager
/**
* Created by pangfan on 2021/8/19
@@ -24,7 +24,7 @@ import com.mogo.och.taxi.utils.StatusManager
* 网约车 - 出租车业务逻辑处理
*/
@SuppressLint("StaticFieldLeak")
object TaxiLoginModel{
object OchCommonLoginModel{
private val TAG = "TaxiLoginModel"
private var mContext: Context? = null
@@ -34,10 +34,7 @@ object TaxiLoginModel{
fun init(context: Context) {
mContext = context.applicationContext
// 达到起始站围栏监听
MogoApisHandler.getInstance()
.apis
.registerCenterApi
.registerCarLocationChangedListener(TAG, mCarLocationChangedListener2)
MogoApisHandler.getInstance().apis.registerCenterApi.registerCarLocationChangedListener(TAG, mCarLocationChangedListener2)
}
fun hasInit():Boolean{
@@ -73,8 +70,8 @@ object TaxiLoginModel{
* 获取手机验证码
*/
fun getPhoneCode(phone: String?) {
TaxiServiceManager.getInstance().getPhoneCode(mContext, phone,
object : TaxiServiceCallback<BaseData?> {
OchCommonServiceManager.getInstance().getPhoneCode(mContext, phone,
object : OchCommonServiceCallback<BaseData?> {
override fun onSuccess(data: BaseData?) {
if (null != data && 0 == data.code) {
// 获取验证码成功
@@ -103,13 +100,16 @@ object TaxiLoginModel{
fun gotoLogin(phone: String, code: String) {
val location4Login = TaxiLoginReqBean.Location4Login(mLatitude, mLongitude)
TaxiServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login,
object : TaxiServiceCallback<TaxiLoginRespBean?> {
OchCommonServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login,
object : OchCommonServiceCallback<TaxiLoginRespBean?> {
override fun onSuccess(data: TaxiLoginRespBean?) {
if (null != data && 0 == data.code) {
// 获取验证码成功
ToastUtils.showShort(mContext?.getString(R.string.module_och_taxi_login_login_success))
StatusManager.setLoginStatus(TaxiLoginStatusEnum.Login)
LoginStatusManager.setLoginStatus(TaxiLoginStatusEnum.Login)
mContext?.let {
SharedPrefs.getInstance(it).putString("och_account",phone)
}
iTaxiLoginCallback?.loginSuccess()
} else {
if (data != null) {

View File

@@ -0,0 +1,44 @@
package com.mogo.och.common.module.biz.model
import android.annotation.SuppressLint
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.SharedPrefs
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean
import com.mogo.och.common.module.biz.callback.ILoginCallback
import com.mogo.och.common.module.biz.callback.ILoginViewCallback
import com.mogo.och.common.module.biz.constant.LoginStatusManager
@SuppressLint("StaticFieldLeak")
object OchCommonLoginStatusDefaultModel : OchCommonLoginStatusModel() {
const val TAG = "OchCommonLoginStatusDefaultModel"
var loginCallback: ILoginCallback? = null
var loginViewCallback: ILoginViewCallback? = null
override fun loginSuccess(data: DriverStatusQueryRespBean?) {
CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginSuccess:${LoginStatusManager.isLogin()}")
if (LoginStatusManager.isLogin()) {
SharedPrefs.getInstance(mContext).putString("och_account", data?.data?.phone)
loginViewCallback?.hideLoginDialogFragment()
} else {
SharedPrefs.getInstance(mContext).putString("och_account", "")
loginViewCallback?.showLoginDialogFragment()
}
loginCallback?.loginSuccess(data)
}
override fun loginFail(isLogin: Boolean) {
CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginFail:$isLogin")
if (isLogin) {
loginViewCallback?.hideLoginDialogFragment()
} else {
loginViewCallback?.showLoginDialogFragment()
}
loginCallback?.loginFail(isLogin)
}
}

View File

@@ -0,0 +1,128 @@
package com.mogo.och.common.module.biz.model;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
import android.content.Context;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.NetworkUtils;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.och.common.module.R;
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean;
import com.mogo.och.common.module.biz.constant.LoginStatusManager;
import com.mogo.och.common.module.biz.constant.OchCommonConst;
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback;
import com.mogo.och.common.module.biz.network.OchCommonServiceManager;
import com.mogo.och.common.module.utils.ToastUtilsOch;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.disposables.Disposable;
public abstract class OchCommonLoginStatusModel {
private static final String TAG = "OchCommonLoginStatusModel";
protected Context mContext;
private Disposable subscribe;
public void init() {
mContext = AbsMogoApplication.getApp();
queryCarStatus();
}
protected abstract void loginSuccess(DriverStatusQueryRespBean data);
protected abstract void loginFail(boolean isLogin);
/**
* 接单状态和登录状态查询
* 1、初始化查询
* 2、错误重试
* 3、错误重试
* 4、登出后重试
* 5、变更出车状态查下
* 6、变更出车状态查下
* 7、网络状态变更后查询
* 8、登录页面关闭后查下状态
*/
public void queryCarStatus() {
OchCommonServiceManager.getInstance().queryDriverServiceStatus(mContext,
new OchCommonServiceCallback<DriverStatusQueryRespBean>() {
@Override
public void onSuccess(DriverStatusQueryRespBean data) {
if (null != data && 0 == data.code) {
LoginStatusManager.setLoginStatus(data.data.driverStatus);
CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + LoginStatusManager.getLoginStatus());
loginSuccess(data);
}
}
@Override
public void onError() {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
} else {
ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
}
subscribe = Observable.timer(5, TimeUnit.SECONDS).subscribe(aLong -> {
queryCarStatus();
});
}
@Override
public void onFail(int code, String msg) {
ToastUtilsOch.showWithCodeMessage(code,msg);
if(code== OchCommonConst.WAIT_TAKEN){
subscribe = Observable.timer(3, TimeUnit.SECONDS).subscribe(aLong -> {
queryCarStatus();
});
}else {
loginFail(LoginStatusManager.isLogin());
}
}
});
}
// 登出
public void logout(double mLatitude,double mLongitude) {
TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude);
OchCommonServiceManager.getInstance().logout(mContext,location4Login,
new OchCommonServiceCallback<BaseData>() {
@Override
public void onSuccess(BaseData data) {
if (null != data && 0 == data.code) {
loginFail(false);
queryCarStatus();
}
}
@Override
public void onError() {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
} else {
ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
}
}
@Override
public void onFail(int code, String msg) {
ToastUtilsOch.showWithCodeMessage(code,msg);
}
});
}
public void release() {
if(subscribe!=null&&!subscribe.isDisposed()){
subscribe.dispose();
}
}
}

View File

@@ -0,0 +1,81 @@
package com.mogo.och.common.module.biz.network;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean;
import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
/**
* Created by pangfan on 2021/8/19
*
* 网约车-出租车接口定义
*/
interface OchCommonServiceApiNew {
/**
* 获取手机验证码
*
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" )
Observable<DriverStatusQueryRespBean> getPhoneCode(@Header("appId") String appId
, @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data);
/**
* 通过验证码登录
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" )
Observable<TaxiLoginRespBean> gotoLoginBycode4Taxi(@Header("appId") String appId
, @Header("ticket") String ticket, @Body TaxiLoginReqBean data);
/**
* 通过验证码登录
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startOperation" )
Observable<TaxiLoginRespBean> gotoLoginBycode4Bus(@Header("appId") String appId
, @Header("ticket") String ticket, @Body TaxiLoginReqBean data);
/**
* 登出接口
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation")
Observable<BaseData> logout4Taxi(@Header("appId") String appId, @Header("ticket") String ticket,
@Body TaxiLogoutReqBean data);
/**
* 登出接口
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endOperation")
Observable<BaseData> logout4Bus(@Header("appId") String appId, @Header("ticket") String ticket,
@Body TaxiLogoutReqBean data);
/**
* 接单状态和登录状态查询 出租车司机端、小巴车司机端、小巴车乘客端
* @param sn
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET( "/autopilot-car-hailing/operation/v1/driver/{flavor}/loginStatus")
Observable<DriverStatusQueryRespBean> queryDriverServiceStatusAndLoginStatus(@Path(value = "flavor",encoded = true) String flavor,@Header ("appId") String appId
, @Header("ticket") String ticket, @Query("sn") String sn);
}

View File

@@ -0,0 +1,18 @@
package com.mogo.och.common.module.biz.network;
/**
* @author congtaowang
* @since 2021/1/15
*
* 修改订单状态回调接口
*/
public interface OchCommonServiceCallback< T > {
void onSuccess(T data);
void onFail(int code, String msg);
default void onError() {
}
}

View File

@@ -0,0 +1,187 @@
package com.mogo.och.common.module.biz.network;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
import android.content.Context;
import com.mogo.cloud.passport.MoGoAiCloudClient;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.eagle.core.network.RequestOptions;
import com.mogo.eagle.core.network.SubscribeImpl;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean;
import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean;
import com.mogo.och.common.module.biz.constant.OchCommonConst;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* Created by pangfan on 2021/8/19
*/
public class OchCommonServiceManager {
private static final String TAG = OchCommonServiceManager.class.getSimpleName();
private static final class SingletonHolder {
private static final OchCommonServiceManager INSTANCE = new OchCommonServiceManager();
}
public static OchCommonServiceManager getInstance() {
return SingletonHolder.INSTANCE;
}
private OchCommonServiceApiNew mOCHTaxiServiceApi;
private OchCommonServiceManager() {
if (mOCHTaxiServiceApi == null){
mOCHTaxiServiceApi = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(OchCommonServiceApiNew.class);
}
}
/**
* 获取手机验证码
* @param context
* @param callback
*/
public void getPhoneCode(Context context, String phone,
OchCommonServiceCallback<BaseData> callback) {
mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
, MoGoAiCloudClientConfig.getInstance().getToken()
, new TaxiLoginSmsReqBean(phone))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context, callback, "getPhoneCode"));
}
/**
* 通过验证码登录
* @param context
* @param callback
*/
public void gotoLoginBycode(Context context, String phone, String code,
TaxiLoginReqBean.Location4Login location4Login,
OchCommonServiceCallback<TaxiLoginRespBean> callback) {
String sn = MoGoAiCloudClientConfig.getInstance().getSn();
Observable<TaxiLoginRespBean> taxiLoginRespBeanObservable = null;
switch (DebugConfig.getProductFlavor()) {
case "fPadLenovoOchTaxi": {//出租车司机
taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Taxi(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
, MoGoAiCloudClientConfig.getInstance().getToken()
, new TaxiLoginReqBean(phone, code, sn, location4Login));
break;
}
case "fPadLenovoOchBus": {//小巴车司机
taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Bus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
, MoGoAiCloudClientConfig.getInstance().getToken()
, new TaxiLoginReqBean(phone, code, sn, location4Login));
break;
}
}
if (taxiLoginRespBeanObservable != null) {
taxiLoginRespBeanObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode"));
}
}
/**
* 登出
*/
public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, OchCommonServiceCallback<BaseData> callback) {
Observable<BaseData> logout = null;
switch (DebugConfig.getProductFlavor()) {
case "fPadLenovoOchTaxi": {//出租车司机
logout = mOCHTaxiServiceApi.logout4Taxi(
MoGoAiCloudClientConfig.getInstance().getServiceAppId(),
MoGoAiCloudClientConfig.getInstance().getToken(),
new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login));
break;
}
case "fPadLenovoOchBus": {//小巴车司机
logout = mOCHTaxiServiceApi.logout4Bus(
MoGoAiCloudClientConfig.getInstance().getServiceAppId(),
MoGoAiCloudClientConfig.getInstance().getToken(),
new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login));
break;
}
}
if (logout != null) {
logout.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context, callback, "logout"));
}
}
/**
* 接单状态和登录状态查询
*
* @param context
* @param callback
*/
public void queryDriverServiceStatus(Context context,
OchCommonServiceCallback<DriverStatusQueryRespBean> callback) {
if (MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()) {
callback.onFail(OchCommonConst.WAIT_TAKEN, "等待令牌中请稍等");
MoGoAiCloudClient.getInstance().refreshToken();
return;
}
String flavor = "";
switch (DebugConfig.getProductFlavor()) {
case "fPadLenovoOchTaxi": {//出租车司机
flavor = "taxi";
break;
}
case "fPadLenovoOchBus": {//小巴车司机
flavor = "bus";
break;
}
case "fPadLenovoOchBusPassenger": {//小巴车乘客
flavor = "bus/passenger";
break;
}
}
mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(flavor, MoGoAiCloudClientConfig.getInstance().getServiceAppId()
, MoGoAiCloudClientConfig.getInstance().getToken()
, MoGoAiCloudClientConfig.getInstance().getSn())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus"));
}
private <T extends BaseData> SubscribeImpl getSubscribeImpl(
Context context, OchCommonServiceCallback<T> callback, String apiName) {
return new SubscribeImpl<T>(RequestOptions.create(context)) {
@Override
public void onSuccess(T o) {
super.onSuccess(o);
CallerLogger.INSTANCE.d(M_TAXI + TAG, apiName + ": onSuccess() " + o.msg);
if (callback != null) {
callback.onSuccess(o);
}
}
@Override
public void onError(Throwable e) {
super.onError(e);
CallerLogger.INSTANCE.e(M_TAXI + TAG, apiName + ": onError() " + e.getMessage());
if (callback != null) {
callback.onError();
}
}
@Override
public void onError(String message, int code) {
super.onError(message, code);
CallerLogger.INSTANCE.e(M_TAXI + TAG, String.format(apiName + ": onError() code = %d; message = %s;", code, message));
if (callback != null) {
callback.onFail(code, message);
}
}
};
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.taxi.presenter
package com.mogo.och.common.module.biz.presenter
import androidx.lifecycle.LifecycleOwner
import com.mogo.commons.AbsMogoApplication
@@ -7,10 +7,10 @@ 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.RegexUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.taxi.R
import com.mogo.och.taxi.callback.ITaxiLoginCallback
import com.mogo.och.taxi.model.TaxiLoginModel
import com.mogo.och.taxi.ui.TaxiLoginDialogFragment
import com.mogo.och.common.module.R
import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment
import com.mogo.och.common.module.biz.callback.ITaxiLoginCallback
import com.mogo.och.common.module.biz.model.OchCommonLoginModel
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -23,7 +23,7 @@ import java.util.concurrent.TimeUnit
*
* 描述
*/
class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) :
class OchCommonLoginPresenter(view: TaxiLoginDialogFragment?) :
Presenter<TaxiLoginDialogFragment?>(view), ITaxiLoginCallback {
private var countDownDisposable: Disposable? = null
@@ -33,12 +33,12 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) :
}
private fun initListeners() {
TaxiLoginModel.init(AbsMogoApplication.getApp())
TaxiLoginModel.setiTaxiLoginCallback(this)
OchCommonLoginModel.init(AbsMogoApplication.getApp())
OchCommonLoginModel.setiTaxiLoginCallback(this)
}
fun getPhoneCode(phone:String){
if(!TaxiLoginModel.hasInit()){
if(!OchCommonLoginModel.hasInit()){
initListeners()
}
if (!RegexUtils.isMobileExact(phone)) {
@@ -46,7 +46,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) :
mView?.inputPhoneError()
return
}
TaxiLoginModel.getPhoneCode(phone)
OchCommonLoginModel.getPhoneCode(phone)
}
override fun onCreate(owner: LifecycleOwner) {
@@ -58,7 +58,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) :
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
TaxiLoginModel.release()
OchCommonLoginModel.release()
countDownDisposable?.let {
if (!it.isDisposed) {
it.dispose()
@@ -67,7 +67,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) :
}
companion object {
private val TAG = TaxiLoginPresenter::class.java.simpleName
private val TAG = OchCommonLoginPresenter::class.java.simpleName
}
override fun getPhoneCodeSuccess() {
@@ -94,7 +94,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) :
}
fun gotoLogin(phone: String, code: String) {
if(!TaxiLoginModel.hasInit()){
if(!OchCommonLoginModel.hasInit()){
initListeners()
}
if (!RegexUtils.isMobileExact(phone)) {
@@ -107,6 +107,6 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) :
return
}
mView?.closeSoftInput()
TaxiLoginModel.gotoLogin(phone,code)
OchCommonLoginModel.gotoLogin(phone,code)
}
}

View File

@@ -0,0 +1,48 @@
package com.mogo.och.common.module.biz.presenter
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent
import com.mogo.och.common.module.biz.callback.ILoginCallback
import com.mogo.och.common.module.biz.callback.ILoginViewCallback
import com.mogo.och.common.module.biz.model.OchCommonLoginStatusDefaultModel
/**
* @author yangyakun
* @since 2020-09-19
*/
class OchCommonLoginStatusDefaultPresenter : LifecycleObserver {
private var isFirstShow = true
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(owner: LifecycleOwner) {
OchCommonLoginStatusDefaultModel.init()
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(owner: LifecycleOwner) {
if (isFirstShow) {
isFirstShow = false
} else {
queryLoginStatus()
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestory(owner: LifecycleOwner) {
OchCommonLoginStatusDefaultModel.release()
}
fun queryLoginStatus() {
OchCommonLoginStatusDefaultModel.queryCarStatus()
}
fun logOut(mLatitude:Double,mLongitude:Double){
OchCommonLoginStatusDefaultModel.logout(mLatitude, mLongitude)
}
fun setLoginCallback(loginCallback: ILoginCallback?,loginViewCallback: ILoginViewCallback?){
OchCommonLoginStatusDefaultModel.loginCallback = loginCallback
OchCommonLoginStatusDefaultModel.loginViewCallback = loginViewCallback
}
}

View File

@@ -0,0 +1,29 @@
package com.mogo.och.common.module.biz.provider
import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.facade.template.IProvider
import com.mogo.och.common.module.biz.callback.ILoginCallback
interface LoginService : IProvider {
/**
* 注册页面
* @param fragment 主页面
* @param callback 回调
*/
fun registerFragment(fragment: Fragment?,loginCallback: ILoginCallback?)
fun unRegisterFragment()
/**
* 查询登录状态
*/
fun queryLoginStatus():Boolean
fun queryLoginStatusByNet()
/**
* 登出
*/
fun loginOut(mLatitude:Double,mLongitude:Double)
}

View File

@@ -0,0 +1,110 @@
package com.mogo.och.common.module.biz.provider
import android.content.Context
import android.content.DialogInterface
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.AppStateManager.currentActivity
import com.mogo.och.common.module.biz.callback.ILoginCallback
import com.mogo.och.common.module.biz.callback.ILoginViewCallback
import com.mogo.och.common.module.biz.constant.LoginStatusManager
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.presenter.OchCommonLoginStatusDefaultPresenter
import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment
import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment.Companion.newInstance
import java.lang.ref.WeakReference
@Route(path = OchCommonConst.LOGINSERVICE)
class LoginServiceImpl : LoginService,ILoginViewCallback {
companion object{
const val TAG = "LoginServiceImpl"
}
private var fragment: Fragment?=null
private var taxiLoginDialogFragment: WeakReference<TaxiLoginDialogFragment>? = null
private var presenter: OchCommonLoginStatusDefaultPresenter?=null
override fun init(context: Context) {
}
override fun registerFragment(fragment: Fragment?,loginCallback: ILoginCallback?) {
presenter = OchCommonLoginStatusDefaultPresenter()
this.fragment = fragment
presenter?.let {
it.setLoginCallback(loginCallback, this)
this.fragment?.lifecycle?.addObserver(it)
}
}
override fun unRegisterFragment() {
this.presenter?.let {
it.setLoginCallback(null,null)
this.fragment?.lifecycle?.removeObserver(it)
}
this.fragment = null
}
override fun showLoginDialogFragment() {
fragment?.let {
CallerHmiManager.hideToolsView()
val parentFragmentManager = it.parentFragmentManager
val fragmentByTag: Fragment? = parentFragmentManager.findFragmentByTag(TAG)
if (fragmentByTag is DialogFragment) {
if (fragmentByTag.dialog != null && fragmentByTag.dialog!!.isShowing) {
return
}
if (fragmentByTag.dialog != null && fragmentByTag.isAdded) {
if (currentActivity() == null) { // 没有在当前应用内 在启动页面关闭应用
d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 权限验证")
return
}
}
}
if (taxiLoginDialogFragment?.get() == null) {
taxiLoginDialogFragment = WeakReference(newInstance())
}
val taxiLoginDialog = taxiLoginDialogFragment?.get()
if (taxiLoginDialog != null) {
if (taxiLoginDialog.dialog != null && taxiLoginDialog.dialog!!.isShowing) {
return
}
if (taxiLoginDialog.isAdded) { //解决方法就是添加这行代码如果已经添加了就移除掉然后再show就不会出现Fragment already added的错误了。
parentFragmentManager.beginTransaction().remove(taxiLoginDialog)
.commitAllowingStateLoss()
}
d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 展示登录界面")
taxiLoginDialog.show(parentFragmentManager, TAG)
taxiLoginDialog.setOnDismissListener(DialogInterface.OnDismissListener { dialog: DialogInterface? ->
taxiLoginDialogFragment?.clear()
presenter?.queryLoginStatus()
})
}
}
}
override fun hideLoginDialogFragment() {
d(SceneConstant.M_TAXI + TAG, "hideLoginDialogFragment 隐藏登录界面")
if (taxiLoginDialogFragment?.get() != null) {
taxiLoginDialogFragment?.get()?.dismissAllowingStateLoss()
}
}
override fun queryLoginStatus():Boolean {
return LoginStatusManager.isLogin()
}
override fun queryLoginStatusByNet() {
presenter?.queryLoginStatus()
}
override fun loginOut(mLatitude:Double,mLongitude:Double) {
presenter?.logOut(mLatitude,mLongitude)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.taxi.ui
package com.mogo.och.common.module.biz.ui
import android.content.DialogInterface
import android.graphics.Rect
@@ -15,7 +15,6 @@ import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.mvp.MvpDialogFragment
import com.mogo.eagle.core.utilcode.kotlin.onClick
@@ -23,16 +22,15 @@ 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.BarUtils
import com.mogo.eagle.core.utilcode.util.KeyboardUtils
import com.mogo.och.taxi.R
import com.mogo.och.taxi.constant.TaxiConst
import com.mogo.och.taxi.presenter.TaxiLoginPresenter
import com.mogo.och.common.module.R
import com.mogo.och.common.module.biz.presenter.OchCommonLoginPresenter
/**
* @author: yangyakun
* @date: 2022/8/15
*/
class TaxiLoginDialogFragment : MvpDialogFragment<TaxiLoginDialogFragment?, TaxiLoginPresenter?>(),
class TaxiLoginDialogFragment : MvpDialogFragment<TaxiLoginDialogFragment?, OchCommonLoginPresenter?>(),
DialogInterface.OnKeyListener {
lateinit var clMain: ConstraintLayout
@@ -169,8 +167,8 @@ class TaxiLoginDialogFragment : MvpDialogFragment<TaxiLoginDialogFragment?, Taxi
}
}
override fun createPresenter(): TaxiLoginPresenter {
return TaxiLoginPresenter(this)
override fun createPresenter(): OchCommonLoginPresenter {
return OchCommonLoginPresenter(this)
}
val COUNTS = 4 // 点击次数

View File

@@ -1,4 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="taxi_2961F2">#2961F2</color>
<color name="taxi_14FF0000">#14FF0000</color>
<color name="taxi_FF0000">#FF0000</color>
<color name="taxi_666666">#666666</color>
<color name="taxi_86A5F7">#86A5F7</color>
<color name="taxi_111533">#111533</color>
<color name="taxi_878890">#878890</color>
<color name="taxi_EF262C">#EF262C</color>
<color name="taxi_4D000000">#4D000000</color>
<color name="och_dialog_bg_color">#3B4577</color>
</resources>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="module_och_taxi_login_title">欢迎您登录</string>
<string name="module_och_taxi_login_btn">登录</string>
<string name="module_och_taxi_login_get_code">获取验证码</string>
<string name="module_och_taxi_login_get_code_title">请输入验证码</string>
<string name="module_och_taxi_login_get_code_success">获取验证码成功</string>
<string name="module_och_taxi_login_login_success">登录成功</string>
<string name="module_och_taxi_login_phone_error">请输入正确的手机号</string>
<string name="module_och_taxi_login_code_error">请输入正确的验证码</string>
<string name="module_och_taxi_login_phone_hint_text">请输入手机号</string>
<string name="module_och_taxi_login_get_phone_title">请输入手机号</string>
<string name="network_error_tip">网络异常,请稍后重试</string>
<string name="request_error_tip">请求出现异常,请稍后重试</string>
</resources>

View File

@@ -1,5 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="DialogFullScreen" parent="Theme.AppCompat.Dialog">
<item name="android:windowIsFloating">false</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowOverscan">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent
</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowEnterAnimation">@null</item>
<item name="android:windowExitAnimation">@null</item>
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowTranslucentNavigation">false</item>
<item name="android:windowFullscreen">false</item>
</style>
<declare-styleable name="RoundLayout">
<attr name="roundLayoutRadius" format="dimension" />

View File

@@ -1,8 +1,8 @@
package com.mogo.och.common.module
import org.junit.Test
import com.zhidao.thirdlogin.utils.Aes
import org.junit.Assert.*
import org.junit.Test
/**
* Example local unit test, which will execute on the development machine (host).
@@ -13,5 +13,11 @@ class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
val json = "{\"device\":\"03cdfec225781de0\",\"time\":" + System.currentTimeMillis() + "}"
val IVS = "tqXMOa6g2w3S4sso+DqCfKAHRNA5jg3Mzp45e33zHFA="
val KEY = "y5VajBH+sTHonJP2a5Uh6uDZcK0fxNB5ORHmbg9B3V0="
val encrypt: String = Aes.encrypt(json, KEY, IVS, "UTF-8")
println(encrypt)
}
}

View File

@@ -54,7 +54,7 @@ public class TaxiPassengerServiceManager {
* @return
*/
private String getDriverAppSn(){
return CallerTelematicManager.INSTANCE.getServerToken();
return "X20202206092431156";
}
/**

View File

@@ -177,7 +177,7 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener {
tvFeel.text = ""
rvCommentList.visibility = View.INVISIBLE
btnSubmit.visibility = View.INVISIBLE
clCommentContain.getLayoutParams().height = 657
clCommentContain.getLayoutParams().height = 748
clCommentContain.requestLayout()
super.onDetachedFromWindow()
subscribe?.let {
@@ -305,7 +305,7 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener {
private fun startChangeHeightAnimarion() {
// 815 除了 点评的高度
val resizeAnimation = ResizeAnimation(clCommentContain,832+rvCommentList.height, clCommentContain.height)
val resizeAnimation = ResizeAnimation(clCommentContain,923+rvCommentList.height, clCommentContain.height)
resizeAnimation.duration = 300
resizeAnimation.setAnimationListener(object :Animation.AnimationListener{
override fun onAnimationStart(animation: Animation?) {

View File

@@ -44,7 +44,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_comment_contain"
android:layout_width="@dimen/dp_867"
android:layout_height="@dimen/dp_657"
android:layout_height="@dimen/dp_748"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@drawable/bg_taxi_p_arrived_info"
app:layout_constraintStart_toStartOf="parent">
@@ -57,6 +57,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_bottom_light"
app:layout_constraintBottom_toBottomOf="parent"
android:src="@drawable/taxi_p_arrived_end_light"
app:layout_constraintStart_toStartOf="parent"
@@ -94,14 +95,30 @@
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_31"
android:includeFontPadding="false"
android:textColor="@android:color/white"
android:textColor="@color/taxi_p_route_txt_color"
android:textSize="@dimen/dp_56"
android:textStyle="bold"
tools:text="环球贸易中心-北门"/>
<TextView
android:id="@+id/arrived_end_wx_pay"
android:layout_width="0dp"
android:maxLines="2"
android:ellipsize="end"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/arrived_end_station"
app:layout_constraintStart_toStartOf="@+id/arrived_end_station"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_31"
android:includeFontPadding="false"
android:textColor="@android:color/white"
android:textSize="@dimen/dp_46"
android:textStyle="bold"
android:text="行程结束,请在小程序端完成支付!"/>
<View
android:id="@+id/v_line"
app:layout_constraintTop_toBottomOf="@+id/arrived_end_station"
app:layout_constraintTop_toBottomOf="@+id/arrived_end_wx_pay"
android:layout_marginTop="@dimen/dp_49"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -6,9 +6,7 @@ package com.mogo.och.taxi.callback;
* Model->Presenter回调接单车状态变更 登录状态变更
*/
public interface ITaxiCarStatusCallback {
void onCarStatusChanged(boolean inOperation,String role);
void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum);
void onCarLoginStatusChange(boolean isLogin);
}

View File

@@ -81,6 +81,5 @@ class TaxiConst {
const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L
const val WAIT_TAKEN = 100046
}
}

View File

@@ -0,0 +1,38 @@
package com.mogo.och.taxi.constant
object TaxtServingStatusManager {
/**
* 接单状态
*/
private var openOrderStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.None
// region 是否可用接单
@JvmStatic
fun isOpeningOrderStatus():Boolean{
if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){
return true
}
return false
}
@JvmStatic
fun setOpenOrderStatus(status: Int) {
when (status) {
0 -> {
this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering
}
1 -> {
this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering
}
else -> {
this.openOrderStatus = TaxiOpenOrderStatusEnum.None
}
}
}
@JvmStatic
fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum {
return openOrderStatus
}
//endregion
}

View File

@@ -13,6 +13,7 @@ import android.net.ConnectivityManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.alibaba.android.arouter.launcher.ARouter;
import com.amap.api.maps.model.LatLng;
import com.elegant.network.utils.GsonUtil;
import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager;
@@ -33,12 +34,14 @@ import com.mogo.eagle.core.utilcode.util.NetworkUtils;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.map.navi.IMogoCarLocationChangedListener2;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.och.common.module.biz.constant.LoginStatusManager;
import com.mogo.och.common.module.biz.constant.OchCommonConst;
import com.mogo.och.common.module.biz.provider.LoginService;
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil;
import com.mogo.och.common.module.utils.PinYinUtil;
import com.mogo.och.common.module.utils.ToastUtilsOch;
import com.mogo.och.taxi.R;
import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
import com.mogo.och.taxi.bean.DriverStatusQueryRespBean;
import com.mogo.och.taxi.bean.OrderGrabRespBean;
import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean;
import com.mogo.och.taxi.bean.OrderQueryRespBean;
@@ -49,19 +52,17 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean;
import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
import com.mogo.och.taxi.bean.QueryOrderRouteResp;
import com.mogo.och.taxi.bean.TaxiDataBaseRespBean;
import com.mogo.och.taxi.bean.TaxiLogoutReqBean;
import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean;
import com.mogo.och.taxi.callback.ITaxiADASStatusCallback;
import com.mogo.och.taxi.callback.ITaxiCarStatusCallback;
import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback;
import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback;
import com.mogo.och.taxi.constant.TaxiDriverRoleEnum;
import com.mogo.och.taxi.constant.TaxiConst;
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
import com.mogo.och.taxi.constant.TaxiOrderTypeEnum;
import com.mogo.och.taxi.constant.TaxtServingStatusManager;
import com.mogo.och.taxi.network.TaxiServiceCallback;
import com.mogo.och.taxi.network.TaxiServiceManager;
import com.mogo.och.taxi.utils.StatusManager;
import com.mogo.och.taxi.utils.TaxiAnalyticsManager;
import com.mogo.och.taxi.utils.OrderUtil;
import com.mogo.aicloud.services.socket.IMogoLifecycleListener;
@@ -78,10 +79,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.disposables.Disposable;
import io.reactivex.exceptions.UndeliverableException;
import io.reactivex.functions.Consumer;
import io.reactivex.plugins.RxJavaPlugins;
@@ -118,7 +116,6 @@ public class TaxiModel {
private ITaxiCarStatusCallback mCarStatusCallback; //Model->Presenter接单状态、登录状态和司机今日接单状态
private ITaxiControllerStatusCallback mControllerStatusCallback; //Model->PresenterVR mode等
private ITaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter订单变更
private Disposable subscribe;
private volatile boolean isRestartAutopilot = false;
@@ -126,6 +123,8 @@ public class TaxiModel {
private double mLongitude, mLatitude;
private LoginService loginService;
private TaxiModel() {
}
@@ -148,6 +147,7 @@ public class TaxiModel {
public void init(Context context) {
mContext = context.getApplicationContext();
initListeners();
loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation();
// IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
// apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId());
@@ -192,16 +192,13 @@ public class TaxiModel {
CallerLogger.INSTANCE.d(M_TAXI + TAG, "Undeliverable exception");
}
});
queryCarStatus();
}
public void release() {
startOrStopOrderLoop(false);
startOrStopCalculateRouteInfo(false);
releaseListeners();
if(subscribe!=null&&!subscribe.isDisposed()){
subscribe.dispose();
}
loginService = null;
}
private void initListeners() {
@@ -247,7 +244,7 @@ public class TaxiModel {
CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
}
private void startOrStopOrderLoop(boolean start) {
public void startOrStopOrderLoop(boolean start) {
CallerLogger.INSTANCE.d(M_TAXI + TAG, "startOrStopOrderLoop() " + start);
if (start) {
TaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop();
@@ -260,82 +257,18 @@ public class TaxiModel {
}
}
/**
* 接单状态和登录状态查询
* 1、初始化查下状态
* 2、点击更新接单状态 如果是初始化状态就查下状态
* 3、点击更新接单状态后 查询状态
* 4、网络状态波动时 查询状态
* 5、登出后更新状态
*/
public void queryCarStatus() {
TaxiServiceManager.getInstance().queryDriverServiceStatus(mContext,
new TaxiServiceCallback<DriverStatusQueryRespBean>() {
@Override
public void onSuccess(DriverStatusQueryRespBean data) {
if (null != data && 0 == data.code) {
StatusManager.setLoginStatus(data.data.driverStatus);
StatusManager.setOpenOrderStatus(data.data.servingStatus);
//更新view
CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + StatusManager.getLoginStatus());
startOrStopOrderLoop(StatusManager.isLogin()&&StatusManager.isOpeningOrderStatus());
if(mCarStatusCallback!=null) {
mCarStatusCallback.onCarLoginStatusChange(StatusManager.isLogin());
}
String role = "";
if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) {
role = TaxiConst.DEMO_USER;
} else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) {
role = TaxiConst.TEST_USER;
}
if (mCarStatusCallback != null) {
mCarStatusCallback.onCarStatusChanged(StatusManager.isOpeningOrderStatus(), role);
}
}
}
@Override
public void onError() {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
} else {
ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
}
subscribe = Observable.timer(5, TimeUnit.SECONDS).subscribe(aLong -> {
queryCarStatus();
});
}
@Override
public void onFail(int code, String msg) {
ToastUtilsOch.showWithCodeMessage(code,msg);
if(code==TaxiConst.WAIT_TAKEN){
subscribe = Observable.timer(3, TimeUnit.SECONDS).subscribe(aLong -> {
queryCarStatus();
});
}else {
if (mCarStatusCallback != null) {
mCarStatusCallback.onCarLoginStatusChange(StatusManager.isLogin());
}
}
}
});
}
//更新接单状态
public void updateCarStatus() {
if(!StatusManager.isLogin()){
queryCarStatus();
if(!LoginStatusManager.isLogin()){
loginService.queryLoginStatusByNet();
return;
}
TaxiServiceManager.getInstance().changeOrderServing(mContext,StatusManager.isOpeningOrderStatus(),
TaxiServiceManager.getInstance().changeOrderServing(mContext,TaxtServingStatusManager.isOpeningOrderStatus(),
new TaxiServiceCallback<BaseData>() {
@Override
public void onSuccess(BaseData data) {
if (null != data && 0 == data.code) {
//StatusManager.changeOrderStatus();
queryCarStatus();
loginService.queryLoginStatusByNet();
}
}
@@ -1001,8 +934,8 @@ public class TaxiModel {
CallerLogger.INSTANCE.d(M_TAXI + TAG, "onIntentReceived = %s", intentStr);
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentStr)) {
if (NetworkUtils.isConnected(mContext)) {
startOrStopOrderLoop(StatusManager.isLogin()&&StatusManager.isOpeningOrderStatus());
queryCarStatus();
startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus());
loginService.queryLoginStatusByNet();
}
}
}
@@ -1579,30 +1512,6 @@ public class TaxiModel {
// 登出
public void logout() {
TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude);
TaxiServiceManager.getInstance().logout(mContext,location4Login,
new TaxiServiceCallback<BaseData>() {
@Override
public void onSuccess(BaseData data) {
if (null != data && 0 == data.code) {
mCarStatusCallback.onCarLoginStatusChange(false);
queryCarStatus();
}
}
@Override
public void onError() {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
} else {
ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
}
}
@Override
public void onFail(int code, String msg) {
ToastUtilsOch.showWithCodeMessage(code,msg);
}
});
loginService.loginOut(mLatitude,mLongitude);
}
}

View File

@@ -2,7 +2,6 @@ package com.mogo.och.taxi.network;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.taxi.bean.CarHeartbeatReqBean;
import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
import com.mogo.och.taxi.bean.DriverStatusQueryRespBean;
import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean;
import com.mogo.och.taxi.bean.OrderCancelReqBean;
import com.mogo.och.taxi.bean.OrderGrabReqBean;
@@ -20,10 +19,6 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean;
import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
import com.mogo.och.taxi.bean.QueryOrderRouteResp;
import com.mogo.och.taxi.bean.TaxiDataBaseRespBean;
import com.mogo.och.taxi.bean.TaxiLoginReqBean;
import com.mogo.och.taxi.bean.TaxiLoginRespBean;
import com.mogo.och.taxi.bean.TaxiLoginSmsReqBean;
import com.mogo.och.taxi.bean.TaxiLogoutReqBean;
import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean;
import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean;
@@ -290,35 +285,6 @@ interface TaxiServiceApiNew {
Observable<TaxiDataBaseRespBean> orderCompleted(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
/**
* 获取手机验证码
*
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
@POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" )
Observable<DriverStatusQueryRespBean> getPhoneCode(@Header ("appId") String appId
,@Header("ticket") String ticket,@Body TaxiLoginSmsReqBean data);
/**
* 通过验证码登录
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" )
Observable<TaxiLoginRespBean> gotoLoginBycode(@Header ("appId") String appId
, @Header("ticket") String ticket, @Body TaxiLoginReqBean data);
/**
* 登出接口
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation")
Observable<BaseData> logout(@Header ("appId") String appId,@Header("ticket") String ticket,
@Body TaxiLogoutReqBean data);
/**
* 暂停接单
* @param data
@@ -339,15 +305,4 @@ interface TaxiServiceApiNew {
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing" )
Observable<BaseData> resetOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body DriverStatusUpdateReqBean data);
/**
* 接单状态和登录状态查询
* @param sn
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
@GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" )
Observable<DriverStatusQueryRespBean> queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId
,@Header("ticket") String ticket,@Query("sn") String sn);
}

View File

@@ -4,7 +4,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAX
import android.content.Context;
import com.mogo.cloud.passport.MoGoAiCloudClient;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
@@ -13,7 +12,6 @@ import com.mogo.eagle.core.network.SubscribeImpl;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.taxi.bean.CarHeartbeatReqBean;
import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
import com.mogo.och.taxi.bean.DriverStatusQueryRespBean;
import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean;
import com.mogo.och.taxi.bean.OrderCancelReqBean;
import com.mogo.och.taxi.bean.OrderGrabReqBean;
@@ -31,10 +29,6 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean;
import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
import com.mogo.och.taxi.bean.QueryOrderRouteResp;
import com.mogo.och.taxi.bean.TaxiDataBaseRespBean;
import com.mogo.och.taxi.bean.TaxiLoginReqBean;
import com.mogo.och.taxi.bean.TaxiLoginRespBean;
import com.mogo.och.taxi.bean.TaxiLoginSmsReqBean;
import com.mogo.och.taxi.bean.TaxiLogoutReqBean;
import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean;
import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean;
import com.mogo.och.taxi.constant.TaxiConst;
@@ -263,26 +257,6 @@ public class TaxiServiceManager {
.subscribe(getSubscribeImpl(context, callback, "updateDriverServiceStatus"));
}
/**
* 接单状态和登录状态查询
* @param context
* @param callback
*/
public void queryDriverServiceStatus(Context context,
TaxiServiceCallback<DriverStatusQueryRespBean> callback) {
if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){
callback.onFail(TaxiConst.WAIT_TAKEN,"等待令牌中请稍等");
MoGoAiCloudClient.getInstance().refreshToken();
return;
}
mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
,MoGoAiCloudClientConfig.getInstance().getToken()
,MoGoAiCloudClientConfig.getInstance().getSn())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus"));
}
/**
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
* @param context
@@ -455,52 +429,6 @@ public class TaxiServiceManager {
}
/**
* 获取手机验证码
* @param context
* @param callback
*/
public void getPhoneCode(Context context,String phone,
TaxiServiceCallback<BaseData> callback) {
mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
, MoGoAiCloudClientConfig.getInstance().getToken()
, new TaxiLoginSmsReqBean(phone))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context, callback, "getPhoneCode"));
}
/**
* 通过验证码登录
* @param context
* @param callback
*/
public void gotoLoginBycode(Context context, String phone, String code,
TaxiLoginReqBean.Location4Login location4Login,
TaxiServiceCallback<TaxiLoginRespBean> callback) {
String sn = MoGoAiCloudClientConfig.getInstance().getSn();
mOCHTaxiServiceApi.gotoLoginBycode(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
, MoGoAiCloudClientConfig.getInstance().getToken()
, new TaxiLoginReqBean(phone, code, sn, location4Login))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode"));
}
/**
* 登出
*/
public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, TaxiServiceCallback<BaseData> callback) {
mOCHTaxiServiceApi.logout(
MoGoAiCloudClientConfig.getInstance().getServiceAppId(),
MoGoAiCloudClientConfig.getInstance().getToken(),
new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscribeImpl(context, callback, "logout"));
}
private <T extends BaseData> SubscribeImpl getSubscribeImpl(
Context context, TaxiServiceCallback<T> callback, String apiName) {
return new SubscribeImpl<T>(RequestOptions.create(context)) {

View File

@@ -15,7 +15,11 @@ import com.mogo.commons.mvp.Presenter;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
import com.mogo.och.common.module.biz.callback.ILoginCallback;
import com.mogo.och.common.module.biz.constant.LoginStatusManager;
import com.mogo.och.taxi.constant.TaxiConst;
import com.mogo.och.taxi.constant.TaxiDriverRoleEnum;
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
import com.mogo.och.taxi.bean.OrderQueryRespBean;
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
@@ -23,6 +27,7 @@ import com.mogo.och.taxi.callback.ITaxiADASStatusCallback;
import com.mogo.och.taxi.callback.ITaxiCarStatusCallback;
import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback;
import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback;
import com.mogo.och.taxi.constant.TaxtServingStatusManager;
import com.mogo.och.taxi.model.TaxiModel;
import com.mogo.och.taxi.ui.TaxiFragment;
@@ -37,11 +42,10 @@ import java.util.List;
* 描述
*/
public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASStatusCallback,
ITaxiCarStatusCallback, ITaxiOrderStatusCallback, ITaxiControllerStatusCallback {
ITaxiCarStatusCallback, ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback {
private static final String TAG = TaxiPresenter.class.getSimpleName();
private boolean isFirstShow = true;
private int preAutopilotStatus = 0;
public TaxiPresenter(TaxiFragment view) {
@@ -64,16 +68,6 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
TaxiModel.getInstance().release();
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
super.onResume(owner);
if(isFirstShow){
isFirstShow = false;
}else {
TaxiModel.getInstance().queryCarStatus();
}
}
private void initListeners() {
TaxiModel.getInstance().setADASStatusCallback(this);
TaxiModel.getInstance().setCarStatusCallback(this);
@@ -120,13 +114,6 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
TaxiModel.getInstance().jumpPassengerCheckDone();
}
/**
* 登录成功后查询登录状态
*/
public void queryLoginStatus() {
TaxiModel.getInstance().queryCarStatus();
}
/**
* 司机确认车辆环境可开启自动驾驶
*/
@@ -225,25 +212,11 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
preAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING;
}
@Override
public void onCarStatusChanged(boolean inOperation, String role) {
runOnUIThread(() -> mView.updateOperationStatus(inOperation,role));
}
@Override
public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) {
runOnUIThread(() -> mView.onServiceDataUpdate(dailyTimeDuration,dailyOrderNum));
}
@Override
public void onCarLoginStatusChange(boolean isLogin) {
if(isLogin){
mView.hideLoginDialogFragment();
}else {
mView.showLoginDialogFragment();
}
}
@Override
public void onOrdersInServiceChanged(@NonNull @NotNull List<OrderQueryRespBean.Result> inServiceList) {
@@ -344,4 +317,29 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
});
}
}
@Override
public void loginSuccess(DriverStatusQueryRespBean data) {
//设置 接单状态
TaxtServingStatusManager.setOpenOrderStatus(data.data.servingStatus);
//设置 是否启动订单轮训
TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus());
// 设置当前用户角色
String role = "";
if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) {
role = TaxiConst.DEMO_USER;
} else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) {
role = TaxiConst.TEST_USER;
}
String finalRole = role;
runOnUIThread(() -> {
mView.updateOperationStatus(TaxtServingStatusManager.isOpeningOrderStatus(), finalRole);
});
}
@Override
public void loginFail(boolean isLogin) {
}
}

View File

@@ -13,15 +13,14 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.eagle.core.data.temp.EventLogout;
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.AppStateManager;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.och.common.module.biz.constant.OchCommonConst;
import com.mogo.och.common.module.biz.provider.LoginService;
import com.mogo.och.taxi.R;
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
import com.mogo.och.taxi.bean.OrderQueryRespBean;
@@ -58,10 +57,19 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
private TaxiGrabOrderFragment grabOrderFragment;
private TaxiServerOrdersFragment serverOrdersFragment;
private WeakReference<TaxiLoginDialogFragment> taxiLoginDialogFragment = null;
private WeakReference<TaxiPersonalDialogFragment> personalDialogFragment = null;
protected double mCurLatitude = 0.0;
protected double mCurLongitude = 0.0;
private LoginService loginService;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation();
if(loginService!=null){
loginService.registerFragment(this, getPresenter());
}
}
@Nullable
@Override
@@ -163,6 +171,8 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
@Override
public void onDestroyView() {
super.onDestroyView();
loginService.unRegisterFragment();
loginService = null;
EventBus.getDefault().unregister(this);
}
@@ -382,57 +392,11 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
mPresenter.logout();
}
public void showLoginDialogFragment(){
CallerHmiManager.INSTANCE.hideToolsView();
Fragment fragmentByTag = getParentFragmentManager().findFragmentByTag(TaxiLoginDialogFragment.Companion.getTAG());
if(fragmentByTag instanceof DialogFragment){
DialogFragment dialogFragment = (DialogFragment)fragmentByTag;
if(dialogFragment.getDialog()!=null&&dialogFragment.getDialog().isShowing()){
return;
}
if(dialogFragment.getDialog()!=null&&dialogFragment.isAdded()){
if (AppStateManager.INSTANCE.currentActivity()==null) {// 没有在当前应用内 在启动页面关闭应用
CallerLogger.INSTANCE.d(M_TAXI + TAG,"showLoginDialogFragment 权限验证");
return;
}
}
}
if(taxiLoginDialogFragment==null||taxiLoginDialogFragment.get()==null) {
taxiLoginDialogFragment = new WeakReference<>(TaxiLoginDialogFragment.newInstance());
}
TaxiLoginDialogFragment taxiLoginDialog = taxiLoginDialogFragment.get();
if(taxiLoginDialog!=null) {
if (taxiLoginDialog.getDialog() != null && taxiLoginDialog.getDialog().isShowing()) {
return;
}
if (taxiLoginDialog.isAdded()) {//解决方法就是添加这行代码如果已经添加了就移除掉然后再show就不会出现Fragment already added的错误了。
getParentFragmentManager().beginTransaction().remove(taxiLoginDialog).commitAllowingStateLoss();
}
CallerLogger.INSTANCE.d(M_TAXI + TAG,"showLoginDialogFragment 展示登录界面");
taxiLoginDialog.show(getParentFragmentManager(), TaxiLoginDialogFragment.Companion.getTAG());
taxiLoginDialog.setOnDismissListener(dialog -> {
taxiLoginDialogFragment.clear();
mPresenter.queryLoginStatus();
});
}
}
public void hideLoginDialogFragment(){
CallerLogger.INSTANCE.d(M_TAXI + TAG,"hideLoginDialogFragment 隐藏登录界面");
if(taxiLoginDialogFragment!=null&&taxiLoginDialogFragment.get()!=null){
taxiLoginDialogFragment.get().dismissAllowingStateLoss();
}
}
private void testRouteInfoUpload() {
TPRouteDataTestUtils.converToRouteData();
}
/**
* Taxi调试信息订单、线路、轨迹等信息
*
* START
*/
//region Taxi调试信息订单、线路、轨迹等信息
private View testBar;
private TextView testCurOrderId;
private TextView testCurLineId;
@@ -477,7 +441,6 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
testCurStopMd5DPQP.setText("SMd5DPQP:" + (order == null ? "" : order.txtFileMd5DPQP));
}
}
/**
* END
*/
//endregion
}

View File

@@ -1,73 +0,0 @@
package com.mogo.och.taxi.utils
import com.mogo.och.taxi.constant.TaxiLoginStatusEnum
import com.mogo.och.taxi.constant.TaxiOpenOrderStatusEnum
object StatusManager {
/**
* 登录状态
*/
private var loginStatus: TaxiLoginStatusEnum = TaxiLoginStatusEnum.None
/**
* 接单状态
*/
private var openOrderStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.None
@JvmStatic
fun setLoginStatus(status: Int) {
when (status) {
0 -> {
this.loginStatus = TaxiLoginStatusEnum.Logout
}
1 -> {
this.loginStatus = TaxiLoginStatusEnum.Login
}
else -> {
this.loginStatus = TaxiLoginStatusEnum.None
}
}
}
@JvmStatic
fun setLoginStatus(loginStatus: TaxiLoginStatusEnum) {
this.loginStatus = loginStatus
}
@JvmStatic
fun getLoginStatus(): TaxiLoginStatusEnum {
return loginStatus
}
@JvmStatic
fun isLogin():Boolean {
if(loginStatus==TaxiLoginStatusEnum.Login){
return true
}
return false
}
// region 是否可用接单
@JvmStatic
fun isOpeningOrderStatus():Boolean{
if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){
return true
}
return false
}
@JvmStatic
fun setOpenOrderStatus(status: Int) {
when (status) {
0 -> {
this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering
}
1 -> {
this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering
}
else -> {
this.openOrderStatus = TaxiOpenOrderStatusEnum.None
}
}
}
@JvmStatic
fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum {
return openOrderStatus
}
//endregion
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -25,14 +25,4 @@
<color name="taxi_passenger_line_color">#657EE2</color>
<color name="taxi_2961F2">#2961F2</color>
<color name="taxi_14FF0000">#14FF0000</color>
<color name="taxi_FF0000">#FF0000</color>
<color name="taxi_666666">#666666</color>
<color name="taxi_86A5F7">#86A5F7</color>
<color name="taxi_111533">#111533</color>
<color name="taxi_878890">#878890</color>
<color name="taxi_EF262C">#EF262C</color>
<color name="taxi_4D000000">#4D000000</color>
</resources>

View File

@@ -32,17 +32,6 @@
<string name="module_och_taxi_auto_disable_tip">自动驾驶状态为0不可用</string>
<string name="module_och_taxi_auto_disable_tip1">司机端未确认可以开启自动驾驶</string>
<string name="module_och_taxi_login_title">欢迎您登录</string>
<string name="module_och_taxi_login_btn">登录</string>
<string name="module_och_taxi_login_get_code">获取验证码</string>
<string name="module_och_taxi_login_get_code_title">请输入验证码</string>
<string name="module_och_taxi_login_get_code_success">获取验证码成功</string>
<string name="module_och_taxi_login_login_success">登录成功</string>
<string name="module_och_taxi_login_phone_error">请输入正确的手机号</string>
<string name="module_och_taxi_login_code_error">请输入正确的验证码</string>
<string name="module_och_taxi_login_phone_hint_text">请输入手机号</string>
<string name="module_och_taxi_login_get_phone_title">请输入手机号</string>
<string name="network_error_tip">网络异常,请稍后重试</string>
<string name="request_error_tip">请求出现异常,请稍后重试</string>
</resources>

View File

@@ -23,22 +23,4 @@
<style name="och_speed_style2">
<item name="android:textSize">32px</item>
</style>
<style name="DialogFullScreen" parent="Theme.AppCompat.Dialog">
<item name="android:windowIsFloating">false</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowOverscan">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent
</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowEnterAnimation">@null</item>
<item name="android:windowExitAnimation">@null</item>
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowTranslucentNavigation">false</item>
<item name="android:windowFullscreen">false</item>
</style>
</resources>

View File

@@ -33,19 +33,19 @@ if (!isAndroidTestBuild()) {
apply plugin: 'apm-plugin'
}
//if (!isAndroidTestBuild()) {
// apply plugin: 'bytex.threadOpt'
// thread_opt {
// enable true
// enableInDebug true
// logLevel "DEBUG"
// //白名单中的类不进行替换
if (!isAndroidTestBuild()) {
apply plugin: 'bytex.threadOpt'
thread_opt {
enable true
enableInDebug true
logLevel "DEBUG"
//白名单中的类不进行替换
// white_list = [
// 'leakcanary.*',
// 'com.loc.*'
// ]
// }
//}
}
}
//if (!isAndroidTestBuild()) {
// /**

View File

@@ -3,14 +3,14 @@ package com.mogo.launcher;
import com.mogo.eagle.core.function.main.MainMoGoApplication;
import android.content.Context;
//import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel;
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
import com.mogo.launcher.crash.CrashSystem;
//import com.mogo.thread.ext.core.ThreadManager;
//import com.mogo.thread.ext.core.config.ThreadConfig;
//
//import java.util.concurrent.ThreadPoolExecutor;
import com.mogo.thread.ext.core.ThreadManager;
import com.mogo.thread.ext.core.config.ThreadConfig;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author congtaowang
@@ -23,36 +23,40 @@ public class MogoApplication extends MainMoGoApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// ThreadConfig.Builder builder = new ThreadConfig.Builder().listener(new ThreadConfig.TaskExecuteListener() {
// @Override
// public boolean isEnabled() {
// return true; // 如果返回true会有后续的回调如果返回false, 不会有后续的回调
// }
ThreadConfig.Builder builder = new ThreadConfig.Builder().listener(new ThreadConfig.TaskExecuteListener() {
@Override
public boolean isEnabled() {
return true; // 如果返回true会有后续的回调如果返回false, 不会有后续的回调
}
@Override
public void onExecutorBefore(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) {
//每个任务执行前回调
// if (type == ThreadConfig.TaskType.HandlerThread) {
//
// @Override
// public void onExecutorBefore(@NonNull Runnable runnable) {
// //每个任务执行前回调
// }
//
// @Override
// public void onExecutorAfter(@NonNull Runnable runnable) {
// //每个任务执行后回调
// }
//
// /**
// * @param core 线程池的核心数
// * @param max 线程池的最大线程数
// * @param active 线程池正在活跃的任务数
// * @param completed 线程池已完成的任务数
// */
// @Override
// public void onExecutorStateChanged(@NonNull ThreadPoolExecutor pool, int core, int max, int active, long completed) {
// //线程池在执行过程,状态变化回调
// //Log.d("POOL", "core:" + core + ";max:" + max + ";active:" + active + ";completed:" + completed);
// }
// });
// builder.loggable(false);
// ThreadManager.INSTANCE.init(builder);
// }
}
@Override
public void onExecutorAfter(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) {
//每个任务执行后回调
}
/**
* @param core 线程池的核心数
* @param max 线程池的最大线程数
* @param active 线程池正在活跃的任务数
* @param completed 线程池已完成的任务数
*/
@Override
public void onExecutorStateChanged(@NonNull ThreadPoolExecutor pool, int core, int max, int active, long completed) {
//线程池在执行过程,状态变化回调
//Log.d("POOL", "core:" + core + ";max:" + max + ";active:" + active + ";completed:" + completed);
}
});
builder.loggable(false);
ThreadManager.INSTANCE.init(builder);
}
@Override

View File

@@ -34,7 +34,7 @@ buildscript {
classpath "com.mogo.cloud:hook:${HOOK_LOG_VERSION}"
classpath "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}"
classpath 'com.volcengine:apm_insight_plugin:1.4.1'
classpath 'com.mogo.thread.opt:plg:2.2.12'
classpath 'com.mogo.thread.opt:plg:3.0.0'
classpath 'com.mogo.cloud:systrace:1.0.1'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18'
classpath 'com.mogo.sticky:service:1.0.8'

View File

@@ -234,7 +234,10 @@ ext {
//========================= Koom ======================
koomnative : "com.kuaishou.koom:koom-native-leak-static:2.2.0",
koomxhook : "com.kuaishou.koom:xhook-static:2.2.0"
koomxhook : "com.kuaishou.koom:xhook-static:2.2.0",
//========================= Koom ======================
recyclerviewadapterhelper : "io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.4"
]
android = [
launcherApplicationId : "com.mogo.launcher",

View File

@@ -1,5 +1,6 @@
package com.mogo.eagle.core.function.autopilot.adapter
import android.location.Location
import chassis.VehicleStateOuterClass
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
@@ -48,6 +49,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPointCloudList
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeAutopilotRecordResult
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.map.navi.MogoCarLocationChangedListenerRegister
import com.zhidao.support.adas.high.AdasManager
import com.zhidao.support.adas.high.OnAdasListener
import com.zhidao.support.adas.high.bean.AutopilotAbility
@@ -77,12 +79,12 @@ class MoGoAdasListenerImpl : OnAdasListener {
//车前引导线
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAJECTORY,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAJECTORY,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onTrajectory(header: MessagePad.Header, trajectory: MessagePad.Trajectory?) {
if (HdMapBuildConfig.isMapLoaded) {
@@ -94,16 +96,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//感知物体
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_RECT_DATA,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_RECT_DATA,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onTrackedObjects(
header: MessagePad.Header,
trackedObjects: MessagePad.TrackedObjects
header: MessagePad.Header,
trackedObjects: MessagePad.TrackedObjects
) {
if (HdMapBuildConfig.isMapLoaded) {
invokeAutopilotIdentifyDataUpdate(trackedObjects.objsList as List<TrackedObject>?)
@@ -112,12 +114,12 @@ class MoGoAdasListenerImpl : OnAdasListener {
//自车定位信息
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_STATE,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_STATE,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onGnssInfo(header: MessagePad.Header, gnssInfo: MessagePad.GnssInfo?) {
invokeAutopilotCarStateData(gnssInfo)
@@ -127,9 +129,9 @@ class MoGoAdasListenerImpl : OnAdasListener {
CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map(gnssInfo)
// 同步更新经纬度和系统时间至 AutoPilotStatusListener
CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon(
gnssInfo.satelliteTime,
gnssInfo.longitude,
gnssInfo.latitude
gnssInfo.satelliteTime,
gnssInfo.longitude,
gnssInfo.latitude
)
}
}
@@ -137,16 +139,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//自车状态(底盘),车灯等。
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onVehicleState(
header: MessagePad.Header,
vehicleState: VehicleStateOuterClass.VehicleState?
header: MessagePad.Header,
vehicleState: VehicleStateOuterClass.VehicleState?
) {
if (vehicleState != null) {
@@ -172,16 +174,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//自动驾驶状态
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_STATUS,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_STATUS,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onAutopilotState(
header: MessagePad.Header,
autopilotState: MessagePad.AutopilotState?
header: MessagePad.Header,
autopilotState: MessagePad.AutopilotState?
) {
if (autopilotState != null) {
//工控机模拟时间
@@ -216,16 +218,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//监控
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_GUARDIAN,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_GUARDIAN,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onReportMessage(
header: MessagePad.Header,
mogoReportMessage: MogoReportMsg.MogoReportMessage?
header: MessagePad.Header,
mogoReportMessage: MogoReportMsg.MogoReportMessage?
) {
if (HdMapBuildConfig.isMapLoaded) {
invokeAutopilotGuardian(mogoReportMessage)
@@ -234,27 +236,27 @@ class MoGoAdasListenerImpl : OnAdasListener {
//感知红绿灯
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAFFIC_LIGHT,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAFFIC_LIGHT,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onPerceptionTrafficLight(
header: MessagePad.Header?,
trafficLights: TrafficLightOuterClass.TrafficLights?
header: MessagePad.Header?,
trafficLights: TrafficLightOuterClass.TrafficLights?
) {
if (trafficLights != null) {
CallerAutopilotIdentifyListenerManager.invokeAutopilotPerceptionTrafficLight(
trafficLights
trafficLights
)
}
}
override fun onPredictionObstacleTrajectory(
header: MessagePad.Header?,
predictionObjects: Prediction.mPredictionObjects?
header: MessagePad.Header?,
predictionObjects: Prediction.mPredictionObjects?
) {
//他车轨迹预测
}
@@ -272,16 +274,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//planning障碍物
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_OBJECTS,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_OBJECTS,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onPlanningObjects(
header: MessagePad.Header?,
planningObjects: MessagePad.PlanningObjects
header: MessagePad.Header?,
planningObjects: MessagePad.PlanningObjects
) {
if (HdMapBuildConfig.isMapLoaded) {
invokeAutopilotIdentifyPlanningObj(planningObjects.objsList as List<MessagePad.PlanningObject>)
@@ -289,24 +291,24 @@ class MoGoAdasListenerImpl : OnAdasListener {
}
override fun onBasicInfoReq(
header: MessagePad.Header,
basicInfoReq: MessagePad.BasicInfoReq?
header: MessagePad.Header,
basicInfoReq: MessagePad.BasicInfoReq?
) {
invokeAutopilotSNRequest()
}
//工控机基础配置信息
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onCarConfigResp(
header: MessagePad.Header,
carConfigResp: MessagePad.CarConfigResp?
header: MessagePad.Header,
carConfigResp: MessagePad.CarConfigResp?
) {
if (HdMapBuildConfig.isMapLoaded && carConfigResp != null) {
AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号
@@ -318,16 +320,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//全局路径规划
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ROUTE,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ROUTE,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onGlobalPathResp(
header: MessagePad.Header,
globalPathResp: MessagePad.GlobalPathResp?
header: MessagePad.Header,
globalPathResp: MessagePad.GlobalPathResp?
) {
if (HdMapBuildConfig.isMapLoaded) {
invokeAutopilotRotting(globalPathResp)
@@ -336,16 +338,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//数据采集badCase
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_RECORD,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_RECORD,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onRecordResult(
header: MessagePad.Header,
recordPanel: RecordPanelOuterClass.RecordPanel?
header: MessagePad.Header,
recordPanel: RecordPanelOuterClass.RecordPanel?
) {
if (recordPanel != null) {
invokeAutopilotRecordResult(recordPanel)
@@ -367,16 +369,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//到站回调
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ARRIVE,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ARRIVE,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onArrivalNotification(
header: MessagePad.Header,
arrivalNotification: MessagePad.ArrivalNotification?
header: MessagePad.Header,
arrivalNotification: MessagePad.ArrivalNotification?
) {
if (HdMapBuildConfig.isMapLoaded) {
invokeArriveAtStation(arrivalNotification)
@@ -385,16 +387,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
//状态查询应答
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onStatusQueryResp(
header: MessagePad.Header?,
statusInfo: SystemStatusInfo.StatusInfo?
header: MessagePad.Header?,
statusInfo: SystemStatusInfo.StatusInfo?
) {
invokeAutopilotStatusRespByQuery(statusInfo)
}
@@ -403,8 +405,8 @@ class MoGoAdasListenerImpl : OnAdasListener {
* 数据采集配置应答
*/
override fun onRecordDataConfigResp(
header: MessagePad.Header?,
config: MessagePad.RecordDataConfig?
header: MessagePad.Header?,
config: MessagePad.RecordDataConfig?
) {
}
@@ -413,16 +415,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
* planning决策状态, 透传
*/
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_ACTIONS,
paramIndexes = [0, 1],
clientPkFileName = "sn"
linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS,
linkCode = CHAIN_LINK_ADAS,
endpoint = PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_ACTIONS,
paramIndexes = [0, 1],
clientPkFileName = "sn"
)
override fun onPlanningActionMsg(
header: MessagePad.Header?,
planningActionMsg: MessagePad.PlanningActionMsg?
header: MessagePad.Header?,
planningActionMsg: MessagePad.PlanningActionMsg?
) {
planningActionMsg?.let {
invokePNCActions(it)

View File

@@ -402,11 +402,6 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
mViewNotificationProvider = provider
}
override fun changeBusOperationStatus(isOut: Boolean) {
busOperationStatus?.changerOperationStatus(isOut)
}
override fun setBusOperationView(view: IOchBusView) {
busOperationStatus = view
busOperationStatus?.showBusOperation()
@@ -1379,6 +1374,7 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
HmiBuildConfig.isShowSnBindingView = isOpen
}
private var takeOver = false
/**
* 工控机监控节点上报
@@ -1386,31 +1382,6 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
ThreadUtils.runOnUiThread {
guardianInfo?.let {
when (it.code) {
EXIT_AUTOPILOT_FOR_PLANNING,
EXIT_AUTOPILOT_FOR_LOCATION,
EXIT_AUTOPILOT_FOR_CHASSIS,
EXIT_AUTOPILOT_FOR_DISTANCE -> {
showWarningV2X(
EventTypeEnum.TAKE_OVER_EVENT.poiType,
EventTypeEnum.TAKE_OVER_EVENT.content,
EventTypeEnum.TAKE_OVER_EVENT.tts,
EventTypeEnum.TAKE_OVER_EVENT.poiType,
object : IMoGoWarningStatusListener {
override fun onShow() {
clTakeOverView.visibility = View.VISIBLE
}
override fun onDismiss() {
clTakeOverView.visibility = View.GONE
}
},
true,
6000L
)
}
}
if (reportList.size > 49) {
reportList.removeLast()
}
@@ -1423,6 +1394,38 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
)
reportListFloatWindow?.refreshData(reportList)
if(FunctionBuildConfig.isDemoMode){
return@let
}
if(takeOver){
return@let
}
when (it.code) {
EXIT_AUTOPILOT_FOR_PLANNING,
EXIT_AUTOPILOT_FOR_LOCATION,
EXIT_AUTOPILOT_FOR_CHASSIS,
EXIT_AUTOPILOT_FOR_DISTANCE -> {
showWarningV2X(
EventTypeEnum.TAKE_OVER_EVENT.poiType,
EventTypeEnum.TAKE_OVER_EVENT.content,
EventTypeEnum.TAKE_OVER_EVENT.tts,
EventTypeEnum.TAKE_OVER_EVENT.poiType,
object : IMoGoWarningStatusListener {
override fun onShow() {
takeOver = true
clTakeOverView.visibility = View.VISIBLE
}
override fun onDismiss() {
takeOver = false
clTakeOverView.visibility = View.GONE
}
},
true,
6000L
)
}
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More