From 4717484c98d916a938dc20b49b9273686cd63d75 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 14 Sep 2022 11:38:39 +0800 Subject: [PATCH 01/14] =?UTF-8?q?[biz]=20=E4=B9=98=E5=AE=A2=E7=AB=AF?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/comment/TaxiPassengerArrivedView.kt | 4 ++-- .../res/layout/taxi_p_arrived_end_panel.xml | 23 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt index b3335b40ee..55a3ba0a59 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt @@ -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?) { diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml index f07f9b6bb4..2a5872ee2b 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml @@ -44,7 +44,7 @@ @@ -57,6 +57,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + Date: Fri, 16 Sep 2022 20:17:12 +0800 Subject: [PATCH 02/14] =?UTF-8?q?[2110]=20=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-bus/build.gradle | 1 + OCH/mogo-och-bus/src/main/AndroidManifest.xml | 2 +- .../och/bus/bean/BusQueryLinesResponse.java | 4 + .../och/bus/callback/IBusLinesCallback.java | 1 + .../com/mogo/och/bus/model/BusLineModel.java | 30 + .../och/bus/presenter/BusLinePresenter.java | 10 + .../och/bus/ui/BusSwitchLineActivity.java | 142 +--- .../mogo/och/bus/ui/BusSwitchLineView.java | 2 + .../och/bus/ui/adapter/OpenItemAnimator.java | 655 ++++++++++++++++++ .../och/bus/ui/adapter/SwitchLineAdapter.kt | 142 ++++ .../bus/ui/adapter/SwitchLineTaskAdapter.java | 73 ++ .../drawable-xhdpi/bus_line_task_arrow.png | Bin 0 -> 491 bytes .../bus_shape_select_line_item_bg_normal.xml | 7 + ...bus_shape_select_line_item_bg_selected.xml | 7 + .../bus_shape_select_line_item_time_bg.xml | 7 + ...hape_select_line_item_time_bg_selected.xml | 6 + .../res/layout/activity_bus_switch_line.xml | 5 +- .../res/layout/bus_switch_line_list_item.xml | 129 ++-- .../layout/bus_switch_line_list_task_item.xml | 18 + .../src/main/res/values/colors.xml | 2 + .../src/main/res/values/strings.xml | 5 +- .../xml/bus_switch_line_list_item_scene.xml | 53 ++ .../mogo/och/common/module/ExampleUnitTest.kt | 10 +- .../network/TaxiPassengerServiceManager.java | 2 +- config.gradle | 5 +- 25 files changed, 1139 insertions(+), 179 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_normal.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml create mode 100644 OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml create mode 100644 OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml diff --git a/OCH/mogo-och-bus/build.gradle b/OCH/mogo-och-bus/build.gradle index eea68114f8..4de0719cb7 100644 --- a/OCH/mogo-och-bus/build.gradle +++ b/OCH/mogo-och-bus/build.gradle @@ -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") diff --git a/OCH/mogo-och-bus/src/main/AndroidManifest.xml b/OCH/mogo-och-bus/src/main/AndroidManifest.xml index 0e09e1a997..76856fd226 100644 --- a/OCH/mogo-och-bus/src/main/AndroidManifest.xml +++ b/OCH/mogo-och-bus/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ /> + android:screenOrientation="landscape" /> \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java index 99ead6ee0e..21dd901fc8 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java @@ -19,5 +19,9 @@ public class BusQueryLinesResponse extends BaseData { public String startSiteName;//始发站名称 public String endSiteName;//终点名称 + public boolean open; + public boolean haveTask; + + public List taskList; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java index b181736278..805a359757 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java @@ -9,4 +9,5 @@ import com.mogo.och.bus.bean.BusQueryLinesResponse; public interface IBusLinesCallback { void onBusLinesChange(BusQueryLinesResponse lines); void onChangeLineIdSuccess(); + void onBusLineTasks(BusQueryLinesResponse o, int position); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java index 0d79156db8..54014f9f5a 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java @@ -63,6 +63,36 @@ public class BusLineModel { }); } + /** + * 通过线路id 查询线路排班表 + * @param lineId + * @param position 位置 + */ + public void queryBusLineTasksById(int lineId, int position){ + BusServiceManager.getInstance().queryBusLines(mContext, new IBusServiceCallback() { + @Override + public void onSuccess(BusQueryLinesResponse 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 lineId){ BusServiceManager.getInstance().switchLine(mContext,lineId, new IBusServiceCallback() { @Override diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java index bafd9f298b..5fb1485874 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java @@ -61,6 +61,10 @@ public class BusLinePresenter extends Presenter implements IB BusLineModel.getInstance().queryBusLines(); } + public void queryBusLineTasks(int lineId, int position){ + BusLineModel.getInstance().queryBusLineTasksById(lineId,position); + } + public void commitSwitchLineId(int lineId){ BusLineModel.getInstance().commitSwitchLineId(lineId); } @@ -77,4 +81,10 @@ public class BusLinePresenter extends Presenter implements IB public void onDestroy(@NonNull LifecycleOwner owner) { super.onDestroy(owner); } + + + @Override + public void onBusLineTasks(BusQueryLinesResponse o, int position) { + mView.onBusLineTasks(o,position); + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java index 847071ba49..ded9038f14 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java @@ -3,9 +3,7 @@ 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; @@ -21,12 +19,19 @@ import androidx.recyclerview.widget.RecyclerView; import com.mogo.commons.mvp.MvpActivity; import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.module.common.view.SpacesItemDecoration; import com.mogo.och.bus.R; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.presenter.BusLinePresenter; +import com.mogo.och.bus.ui.adapter.OpenItemAnimator; +import com.mogo.och.bus.ui.adapter.SwitchLineAdapter; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; /** * @author: wangmingjun @@ -43,6 +48,8 @@ public class BusSwitchLineActivity extends MvpActivity mData = new ArrayList<>(); private int mSelectLineId = -1; + private Disposable subscribe; + @Override protected int getLayoutId() { return R.layout.activity_bus_switch_line; @@ -79,19 +86,19 @@ public class BusSwitchLineActivity extends MvpActivity position && !TextUtils.isEmpty(mData.get(position).startSiteName ) - && !TextUtils.isEmpty(mData.get(position).endSiteName)){ - mSelectLineId = mData.get(position).lineId; - }else { - mSelectLineId = -1; - } + mAdapter.setOnLineItemClickListener((position) -> { + mPresenter.queryBusLineTasks(mData.get(position).lineId,position); + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); } + subscribe = Observable.timer(3, TimeUnit.MINUTES).subscribe(aLong -> { + mPresenter.queryBusLineTasks(mData.get(position).lineId,position); + }); }); } @@ -165,6 +172,24 @@ public class BusSwitchLineActivity extends MvpActivity(); + } + if(o.data.size()!=result.taskList.size()) {// 不相等有变动 重新赋值 + result.taskList.clear(); + if (position % 3 != 0) { + result.taskList.addAll(o.data); + result.haveTask = false; + } else { + result.haveTask = true; + } + } + mAdapter.notifyItemChanged(position); + } + /** * 有无数据UI显示 * @param b @@ -195,105 +220,14 @@ public class BusSwitchLineActivity extends MvpActivity{ - - private Context mContext; - private List mData; - // RecyclerView设置点击事件 - private LineItemClickListener mItemClickListener ; - private int clickPos = -1; - - public SwitchLineAdapter(Context context, List data){ - mContext = context; - mData = data; + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); } - - @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) ; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java index febd6429b1..14309a101f 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java @@ -11,5 +11,7 @@ public interface BusSwitchLineView extends IView { void onBusLinesChange(BusQueryLinesResponse data); void onChangeLineIdSuccess(); + + void onBusLineTasks(BusQueryLinesResponse o, int position); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java new file mode 100644 index 0000000000..1571739e3b --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java @@ -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 mPendingRemovals = new ArrayList<>(); + private ArrayList mPendingAdditions = new ArrayList<>(); + private ArrayList mPendingMoves = new ArrayList<>(); + private ArrayList mPendingChanges = new ArrayList<>(); + + ArrayList> mAdditionsList = new ArrayList<>(); + ArrayList> mMovesList = new ArrayList<>(); + ArrayList> mChangesList = new ArrayList<>(); + + ArrayList mAddAnimations = new ArrayList<>(); + ArrayList mMoveAnimations = new ArrayList<>(); + ArrayList mRemoveAnimations = new ArrayList<>(); + ArrayList mChangeAnimations = new ArrayList<>(); + + private static class MoveInfo { + public RecyclerView.ViewHolder holder; + public int fromX, fromY, toX, toY; + + MoveInfo(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { + this.holder = holder; + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + } + + private static class ChangeInfo { + public RecyclerView.ViewHolder oldHolder, newHolder; + public int fromX, fromY, toX, toY; + private ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder) { + this.oldHolder = oldHolder; + this.newHolder = newHolder; + } + + ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, + int fromX, int fromY, int toX, int toY) { + this(oldHolder, newHolder); + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + + @Override + public String toString() { + return "ChangeInfo{" + + "oldHolder=" + oldHolder + + ", newHolder=" + newHolder + + ", fromX=" + fromX + + ", fromY=" + fromY + + ", toX=" + toX + + ", toY=" + toY + + '}'; + } + } + + @Override + public void runPendingAnimations() { + boolean removalsPending = !mPendingRemovals.isEmpty(); + boolean movesPending = !mPendingMoves.isEmpty(); + boolean changesPending = !mPendingChanges.isEmpty(); + boolean additionsPending = !mPendingAdditions.isEmpty(); + if (!removalsPending && !movesPending && !additionsPending && !changesPending) { + // nothing to animate + return; + } + // First, remove stuff + for (RecyclerView.ViewHolder holder : mPendingRemovals) { + animateRemoveImpl(holder); + } + mPendingRemovals.clear(); + // Next, move stuff + if (movesPending) { + final ArrayList moves = new ArrayList<>(); + 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 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 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 infoList, RecyclerView.ViewHolder item) { + for (int i = infoList.size() - 1; i >= 0; i--) { + ChangeInfo changeInfo = infoList.get(i); + if (endChangeAnimationIfNecessary(changeInfo, item)) { + if (changeInfo.oldHolder == null && changeInfo.newHolder == null) { + infoList.remove(changeInfo); + } + } + } + } + + private void endChangeAnimationIfNecessary(ChangeInfo changeInfo) { + if (changeInfo.oldHolder != null) { + endChangeAnimationIfNecessary(changeInfo, changeInfo.oldHolder); + } + if (changeInfo.newHolder != null) { + endChangeAnimationIfNecessary(changeInfo, changeInfo.newHolder); + } + } + private boolean endChangeAnimationIfNecessary(ChangeInfo changeInfo, RecyclerView.ViewHolder item) { + boolean oldItem = false; + if (changeInfo.newHolder == item) { + changeInfo.newHolder = null; + } else if (changeInfo.oldHolder == item) { + changeInfo.oldHolder = null; + oldItem = true; + } else { + return false; + } + item.itemView.setAlpha(1); + item.itemView.setTranslationX(0); + item.itemView.setTranslationY(0); + dispatchChangeFinished(item, oldItem); + return true; + } + + @Override + public void endAnimation(RecyclerView.ViewHolder item) { + final View view = item.itemView; + // this will trigger end callback which should set properties to their target values. + view.animate().cancel(); + // TODO if some other animations are chained to end, how do we cancel them as well? + for (int i = mPendingMoves.size() - 1; i >= 0; i--) { + MoveInfo moveInfo = mPendingMoves.get(i); + if (moveInfo.holder == item) { + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item); + mPendingMoves.remove(i); + } + } + endChangeAnimation(mPendingChanges, item); + if (mPendingRemovals.remove(item)) { + view.setAlpha(1); + dispatchRemoveFinished(item); + } + if (mPendingAdditions.remove(item)) { + view.setAlpha(1); + dispatchAddFinished(item); + } + + for (int i = mChangesList.size() - 1; i >= 0; i--) { + ArrayList changes = mChangesList.get(i); + endChangeAnimation(changes, item); + if (changes.isEmpty()) { + mChangesList.remove(i); + } + } + for (int i = mMovesList.size() - 1; i >= 0; i--) { + ArrayList moves = mMovesList.get(i); + for (int j = moves.size() - 1; j >= 0; j--) { + MoveInfo moveInfo = moves.get(j); + if (moveInfo.holder == item) { + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item); + moves.remove(j); + if (moves.isEmpty()) { + mMovesList.remove(i); + } + break; + } + } + } + for (int i = mAdditionsList.size() - 1; i >= 0; i--) { + ArrayList additions = mAdditionsList.get(i); + if (additions.remove(item)) { + view.setAlpha(1); + dispatchAddFinished(item); + if (additions.isEmpty()) { + mAdditionsList.remove(i); + } + } + } + + // animations should be ended by the cancel above. + //noinspection PointlessBooleanExpression,ConstantConditions + if (mRemoveAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mRemoveAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mAddAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mAddAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mChangeAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mChangeAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mMoveAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mMoveAnimations list"); + } + dispatchFinishedWhenDone(); + } + + private void resetAnimation(RecyclerView.ViewHolder holder) { + if (sDefaultInterpolator == null) { + sDefaultInterpolator = new ValueAnimator().getInterpolator(); + } + holder.itemView.animate().setInterpolator(sDefaultInterpolator); + endAnimation(holder); + } + + @Override + public boolean isRunning() { + return (!mPendingAdditions.isEmpty() + || !mPendingChanges.isEmpty() + || !mPendingMoves.isEmpty() + || !mPendingRemovals.isEmpty() + || !mMoveAnimations.isEmpty() + || !mRemoveAnimations.isEmpty() + || !mAddAnimations.isEmpty() + || !mChangeAnimations.isEmpty() + || !mMovesList.isEmpty() + || !mAdditionsList.isEmpty() + || !mChangesList.isEmpty()); + } + + /** + * Check the state of currently pending and running animations. If there are none + * pending/running, call {@link #dispatchAnimationsFinished()} to notify any + * listeners. + */ + void dispatchFinishedWhenDone() { + if (!isRunning()) { + dispatchAnimationsFinished(); + } + } + + @Override + public void endAnimations() { + int count = mPendingMoves.size(); + for (int i = count - 1; i >= 0; i--) { + MoveInfo item = mPendingMoves.get(i); + View view = item.holder.itemView; + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item.holder); + mPendingMoves.remove(i); + } + count = mPendingRemovals.size(); + for (int i = count - 1; i >= 0; i--) { + RecyclerView.ViewHolder item = mPendingRemovals.get(i); + dispatchRemoveFinished(item); + mPendingRemovals.remove(i); + } + count = mPendingAdditions.size(); + for (int i = count - 1; i >= 0; i--) { + RecyclerView.ViewHolder item = mPendingAdditions.get(i); + item.itemView.setAlpha(1); + dispatchAddFinished(item); + mPendingAdditions.remove(i); + } + count = mPendingChanges.size(); + for (int i = count - 1; i >= 0; i--) { + endChangeAnimationIfNecessary(mPendingChanges.get(i)); + } + mPendingChanges.clear(); + if (!isRunning()) { + return; + } + + int listCount = mMovesList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList moves = mMovesList.get(i); + count = moves.size(); + for (int j = count - 1; j >= 0; j--) { + MoveInfo moveInfo = moves.get(j); + RecyclerView.ViewHolder item = moveInfo.holder; + View view = item.itemView; + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(moveInfo.holder); + moves.remove(j); + if (moves.isEmpty()) { + mMovesList.remove(moves); + } + } + } + listCount = mAdditionsList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList additions = mAdditionsList.get(i); + count = additions.size(); + for (int j = count - 1; j >= 0; j--) { + RecyclerView.ViewHolder item = additions.get(j); + View view = item.itemView; + view.setAlpha(1); + dispatchAddFinished(item); + additions.remove(j); + if (additions.isEmpty()) { + mAdditionsList.remove(additions); + } + } + } + listCount = mChangesList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList changes = mChangesList.get(i); + count = changes.size(); + for (int j = count - 1; j >= 0; j--) { + endChangeAnimationIfNecessary(changes.get(j)); + if (changes.isEmpty()) { + mChangesList.remove(changes); + } + } + } + + cancelAll(mRemoveAnimations); + cancelAll(mMoveAnimations); + cancelAll(mAddAnimations); + cancelAll(mChangeAnimations); + + dispatchAnimationsFinished(); + } + + void cancelAll(List viewHolders) { + for (int i = viewHolders.size() - 1; i >= 0; i--) { + viewHolders.get(i).itemView.animate().cancel(); + } + } + + /** + * {@inheritDoc} + *

+ * If the payload list is not empty, DefaultItemAnimator returns true. + * When this is the case: + *

    + *
  • If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both + * ViewHolder arguments will be the same instance. + *
  • + *
  • + * If you are not overriding {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, + * then DefaultItemAnimator will call {@link #animateMove(RecyclerView.ViewHolder, int, int, int, int)} and + * run a move animation instead. + *
  • + *
+ */ + @Override + public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, + @NonNull List payloads) { + return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads); + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt new file mode 100644 index 0000000000..45f0d1b1fb --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt @@ -0,0 +1,142 @@ +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 +) : RecyclerView.Adapter() { + companion object{ + const val TAG = "SwitchLineAdapter" + } + // RecyclerView设置点击事件 + private var mItemClickListener: LineItemClickListener? = null + 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, + line.taskList + ) + 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 + } + closeOther() + mItemClickListener?.onItemClick(currentPosition) + line.open = holder.rvLineTask.visibility == View.GONE + } + } + + private fun closeOther() { + mData.forEachIndexed { index, result -> + if(result.open){ + result.open = false; + notifyItemChanged(index) + } + } + } + + 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) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java new file mode 100644 index 0000000000..9920b88d1a --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java @@ -0,0 +1,73 @@ +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.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.och.bus.R; +import com.mogo.och.bus.bean.BusQueryLinesResponse; + +import java.util.List; + +/** + * 路线列表adapter + */ +public class SwitchLineTaskAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List mData; + + public SwitchLineTaskAdapter(Context context, List data) { + mContext = context; + mData = data; + } + + @NonNull + @Override + public SwitchLineTaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(mContext).inflate(R.layout.bus_switch_line_list_task_item + , parent, false); + return new SwitchLineTaskViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull SwitchLineTaskViewHolder holder, int position) { + int currentPosition = holder.getBindingAdapterPosition(); + BusQueryLinesResponse.Result line = mData.get(currentPosition); + holder.lineTask.setText(line.name); + holder.lineTask.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + } + + @Override + public int getItemCount() { + return mData==null?0:mData.size(); + } + + static class SwitchLineTaskViewHolder extends RecyclerView.ViewHolder { + + private TextView lineTask; // 时间 + + public SwitchLineTaskViewHolder(@NonNull View itemView) { + super(itemView); + lineTask = itemView.findViewById(R.id.actv_line_task); + } + } + + public interface LineItemClickListener { + void onItemClick(int position) ; + } + +} + + diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b32f0693a6bd437f6e1c5e6039e9f9ef092dcaa3 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^!a%IV!3HGvmOVNGq!^2X+?^QKos)S9xJU2c1fa4|PZ!4! z58k!YZhJX7inQtOUB6p{=W{@cUAzAS=}KLeMwW#gi(Icr|4^Bzv9xm6`=D+2oAgo) zCv8p>`?KNttCez^+OPBCOQV(s$U*6*hMs&A9%+1V6SKe zcg{lwvo!~dHcVxX*v_PV;2PHsMf>mbuP)QG@cHvgmP=ku;3tFklEd$rAM_cUGQ=+a z;K}VW?K02H57B-*xHW1PGIwrfWjwWz^U}pd1wZ249$VZtTTsjHHNCujy@=Ft%U29< zty|_-J}>7;exV?{UgVF%rfG&RyH87-UOwuY5GwNA>+AL1!VL$f@71j;wf^om OKzq9SxvX + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml new file mode 100644 index 0000000000..e5faafb27b --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml new file mode 100644 index 0000000000..ee8088637c --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml new file mode 100644 index 0000000000..e2b482ee5f --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml index 91d2b5134d..95482563ea 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml @@ -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"> + android:background="@drawable/bus_shape_select_line_item_bg_normal"> + + + 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" /> - + 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" /> - - - - - - - - - + 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" /> + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml new file mode 100644 index 0000000000..07cb6d0eec --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml @@ -0,0 +1,18 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/colors.xml b/OCH/mogo-och-bus/src/main/res/values/colors.xml index 96338fac55..388f2f67d1 100644 --- a/OCH/mogo-och-bus/src/main/res/values/colors.xml +++ b/OCH/mogo-och-bus/src/main/res/values/colors.xml @@ -45,4 +45,6 @@ #FFFFE198 #FFFF9B00 #59FFFFFF + + #B9C3E9 \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/strings.xml b/OCH/mogo-och-bus/src/main/res/values/strings.xml index 992ab6c19c..ec3fa24cce 100644 --- a/OCH/mogo-och-bus/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml @@ -5,7 +5,9 @@ 启动成功 启动失败 自动驾驶 - 路线列表 + 任务列表 + 暂无任务 + 选择时间 路线: 起点: 终点: @@ -17,6 +19,7 @@ 当前车辆无路线\n请联系运营人员绑定 起点: 终点: + 往%1$s方向 更换路线成功 更换路线失败 diff --git a/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml b/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml new file mode 100644 index 0000000000..76ec386d95 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt b/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt index 76f5f67a00..b10afe9aa9 100644 --- a/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt +++ b/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt @@ -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) } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java index f052794c40..5af7ed7006 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java @@ -54,7 +54,7 @@ public class TaxiPassengerServiceManager { * @return */ private String getDriverAppSn(){ - return CallerTelematicManager.INSTANCE.getServerToken(); + return "X20202206092431156"; } /** diff --git a/config.gradle b/config.gradle index 0341f9f4a2..38964cc4ed 100644 --- a/config.gradle +++ b/config.gradle @@ -248,7 +248,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" ] } From 8648a9e5334c5cf992cc730fe20b30e5d3a5de1c Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 20 Sep 2022 11:37:20 +0800 Subject: [PATCH 03/14] =?UTF-8?q?[2110]=20=E6=8A=BD=E5=8F=96taxi=E5=88=B0c?= =?UTF-8?q?ommon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-common-module/build.gradle | 22 +++ .../biz}/bean/DriverStatusQueryRespBean.java | 2 +- .../module/biz}/bean/TaxiLoginReqBean.java | 6 +- .../module/biz}/bean/TaxiLoginRespBean.java | 8 +- .../module/biz}/bean/TaxiLoginSmsReqBean.java | 6 +- .../module/biz}/bean/TaxiLogoutReqBean.java | 6 +- .../module/biz/callback/ILoginCallback.java | 9 ++ .../module/biz/callback/ILoginViewCallback.kt | 13 ++ .../biz}/callback/ITaxiLoginCallback.java | 9 +- .../module/biz/constant/LoginStatusManager.kt | 38 +++++ .../module/biz/constant/OchCommonConst.kt | 28 ++++ .../biz}/constant/TaxiLoginStatusEnum.kt | 2 +- .../module/biz/model/OchCommonLoginModel.kt} | 40 +++-- .../model/OchCommonLoginStatusDefaultModel.kt | 41 +++++ .../biz/model/OchCommonLoginStatusModel.java | 128 ++++++++++++++++ .../biz/network/OchCommonServiceApiNew.java | 63 ++++++++ .../biz/network/OchCommonServiceCallback.java | 18 +++ .../biz/network/OchCommonServiceManager.java | 143 ++++++++++++++++++ .../biz/presenter/OchCommonLoginPresenter.kt} | 28 ++-- .../OchCommonLoginStatusDefaultPresenter.kt | 48 ++++++ .../module/biz/provider/LoginService.kt | 29 ++++ .../module/biz/provider/LoginServiceImpl.kt | 109 +++++++++++++ .../module/biz}/ui/TaxiLoginDialogFragment.kt | 14 +- .../color/taxi_login_get_code_text_color.xml | 0 .../res/drawable-xhdpi}/taxi_ic_login_bg.webp | Bin .../res/drawable/taxi_login_bg_selector.xml | 0 .../main/res/drawable/taxi_login_enable.xml | 0 .../taxi_login_get_code_text_color.xml | 0 .../res/drawable/taxi_login_phone_error.xml | 0 .../res/drawable/taxi_login_phone_normal.xml | 0 .../main/res/drawable/taxi_login_unenable.xml | 0 .../src/main/res/layout/taxi_login_view.xml | 0 .../src/main/res/values/colors.xml | 13 ++ .../src/main/res/values/strings.xml | 17 +++ .../src/main/res/values/styles.xml | 21 +++ .../taxi/callback/ITaxiCarStatusCallback.java | 2 - .../com/mogo/och/taxi/constant/TaxiConst.kt | 1 - .../taxi/constant/TaxtServingStatusManager.kt | 38 +++++ .../com/mogo/och/taxi/model/TaxiModel.java | 124 ++------------- .../och/taxi/network/TaxiServiceApiNew.java | 45 ------ .../och/taxi/network/TaxiServiceManager.java | 72 --------- .../och/taxi/presenter/TaxiPresenter.java | 64 ++++---- .../com/mogo/och/taxi/ui/TaxiFragment.java | 73 +++------ .../com/mogo/och/taxi/utils/StatusManager.kt | 73 --------- .../taxi_ic_login_bg.webp | Bin 44568 -> 0 bytes .../res/drawable-xhdpi/taxi_ic_login_bg.webp | Bin 44568 -> 0 bytes .../src/main/res/values/colors.xml | 10 -- .../src/main/res/values/strings.xml | 11 -- .../src/main/res/values/styles.xml | 18 --- 49 files changed, 896 insertions(+), 496 deletions(-) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/DriverStatusQueryRespBean.java (90%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginReqBean.java (81%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginRespBean.java (54%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginSmsReqBean.java (54%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLogoutReqBean.java (77%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/callback/ITaxiLoginCallback.java (58%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/constant/TaxiLoginStatusEnum.kt (90%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt} (78%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt} (79%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/ui/TaxiLoginDialogFragment.kt (96%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/color/taxi_login_get_code_text_color.xml (100%) rename OCH/{mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440 => mogo-och-common-module/src/main/res/drawable-xhdpi}/taxi_ic_login_bg.webp (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_bg_selector.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_enable.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_get_code_text_color.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_phone_error.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_phone_normal.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_unenable.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/layout/taxi_login_view.xml (100%) create mode 100644 OCH/mogo-och-common-module/src/main/res/values/colors.xml create mode 100644 OCH/mogo-och-common-module/src/main/res/values/strings.xml create mode 100644 OCH/mogo-och-common-module/src/main/res/values/styles.xml create mode 100644 OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt delete mode 100644 OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/StatusManager.kt delete mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp delete mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp diff --git a/OCH/mogo-och-common-module/build.gradle b/OCH/mogo-och-common-module/build.gradle index 1f74335527..927d871c22 100644 --- a/OCH/mogo-och-common-module/build.gradle +++ b/OCH/mogo-och-common-module/build.gradle @@ -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 diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java similarity index 90% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java index ac630c9ecf..903fece224 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java @@ -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; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java similarity index 81% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java index 0591d3f878..ebe1fa2731 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java @@ -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 { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java similarity index 54% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java index c1265a9be3..9cda2a96c6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java @@ -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; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java similarity index 54% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java index 3a4d4d7a4f..3c246bc153 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java @@ -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 { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java similarity index 77% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java index ced9b2eddb..22e63dd838 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java @@ -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; diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java new file mode 100644 index 0000000000..481a2cd75b --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java @@ -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); +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt new file mode 100644 index 0000000000..033e900e77 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.biz.callback + +interface ILoginViewCallback { + /** + * 展示登录页面 + */ + fun showLoginDialogFragment() + + /** + * 隐藏登录页面 + */ + fun hideLoginDialogFragment() +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java similarity index 58% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java index a8f35171cb..5cbca0d853 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java @@ -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 diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt new file mode 100644 index 0000000000..8f290529b7 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt @@ -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 + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt new file mode 100644 index 0000000000..55a0b5cc2a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt @@ -0,0 +1,28 @@ +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 + + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt similarity index 90% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt index 5e19782f5e..451196d777 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.constant +package com.mogo.och.common.module.biz.constant /** * Created on 2022/08/19 diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt similarity index 78% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt index bdef0b53fd..08f1acc43f 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt @@ -1,21 +1,20 @@ -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.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 +23,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 +33,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 +69,8 @@ object TaxiLoginModel{ * 获取手机验证码 */ fun getPhoneCode(phone: String?) { - TaxiServiceManager.getInstance().getPhoneCode(mContext, phone, - object : TaxiServiceCallback { + OchCommonServiceManager.getInstance().getPhoneCode(mContext, phone, + object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { if (null != data && 0 == data.code) { // 获取验证码成功 @@ -103,13 +99,13 @@ object TaxiLoginModel{ fun gotoLogin(phone: String, code: String) { val location4Login = TaxiLoginReqBean.Location4Login(mLatitude, mLongitude) - TaxiServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login, - object : TaxiServiceCallback { + OchCommonServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login, + object : OchCommonServiceCallback { 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) iTaxiLoginCallback?.loginSuccess() } else { if (data != null) { diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt new file mode 100644 index 0000000000..c935981982 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt @@ -0,0 +1,41 @@ +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.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()) { + loginViewCallback?.hideLoginDialogFragment() + } else { + 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) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java new file mode 100644 index 0000000000..0b1e9f0bfb --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java @@ -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() { + @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() { + @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(); + } + } + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java new file mode 100644 index 0000000000..da32fc85be --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java @@ -0,0 +1,63 @@ +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.Query; + +/** + * Created by pangfan on 2021/8/19 + * + * 网约车-出租车接口定义 + */ +interface OchCommonServiceApiNew { + /** + * 获取手机验证码 + * + * @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 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 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 logout(@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/api/v1/driver/serviceStatus/query" ) + @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" ) + Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId + ,@Header("ticket") String ticket,@Query("sn") String sn); + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java new file mode 100644 index 0000000000..8433def5f0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java @@ -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() { + + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java new file mode 100644 index 0000000000..668f781253 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java @@ -0,0 +1,143 @@ +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.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.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 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 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, OchCommonServiceCallback 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")); + } + + /** + * 接单状态和登录状态查询 + * @param context + * @param callback + */ + public void queryDriverServiceStatus(Context context, + OchCommonServiceCallback callback) { + if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){ + callback.onFail(OchCommonConst.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")); + } + + + + private SubscribeImpl getSubscribeImpl( + Context context, OchCommonServiceCallback callback, String apiName) { + return new SubscribeImpl(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); + } + } + }; + } +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt similarity index 79% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt index 1497683ddc..49b8446a77 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt @@ -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(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) } } \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt new file mode 100644 index 0000000000..a4c77ec190 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt @@ -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 + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt new file mode 100644 index 0000000000..a311da107f --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt @@ -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) + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt new file mode 100644 index 0000000000..dcbe881200 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt @@ -0,0 +1,109 @@ +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.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 = "/ochbiz/common/login") +class LoginServiceImpl : LoginService,ILoginViewCallback { + + companion object{ + const val TAG = "LoginServiceImpl" + } + + private var fragment: Fragment?=null + private var taxiLoginDialogFragment: WeakReference? = 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) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt similarity index 96% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt index 19da74fbae..b08e15472d 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt @@ -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(), +class TaxiLoginDialogFragment : MvpDialogFragment(), DialogInterface.OnKeyListener { lateinit var clMain: ConstraintLayout @@ -169,8 +167,8 @@ class TaxiLoginDialogFragment : MvpDialogFragment + + #2961F2 + #14FF0000 + #FF0000 + #666666 + #86A5F7 + #111533 + #878890 + #EF262C + #4D000000 + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/strings.xml b/OCH/mogo-och-common-module/src/main/res/values/strings.xml new file mode 100644 index 0000000000..f2d52ad1eb --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/strings.xml @@ -0,0 +1,17 @@ + + + + 欢迎您登录 + 登录 + 获取验证码 + 请输入验证码 + 获取验证码成功 + 登录成功 + 请输入正确的手机号 + 请输入正确的验证码 + 请输入手机号 + 请输入手机号 + + 网络异常,请稍后重试 + 请求出现异常,请稍后重试 + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/styles.xml b/OCH/mogo-och-common-module/src/main/res/values/styles.xml new file mode 100644 index 0000000000..b205c0fd04 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/styles.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java index ac0eddc08a..b51f44ec35 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java @@ -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); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt index 41a1280592..2a399bb339 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt @@ -81,6 +81,5 @@ class TaxiConst { const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L - const val WAIT_TAKEN = 100046 } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt new file mode 100644 index 0000000000..7a42236e8b --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt @@ -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 +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index 06b77b0491..dc0f367ad6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -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; @@ -34,12 +35,13 @@ 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.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; @@ -50,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; @@ -79,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; @@ -119,7 +116,6 @@ public class TaxiModel { private ITaxiCarStatusCallback mCarStatusCallback; //Model->Presenter:接单状态、登录状态和司机今日接单状态 private ITaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 private ITaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更 - private Disposable subscribe; private volatile boolean isRestartAutopilot = false; @@ -127,6 +123,8 @@ public class TaxiModel { private double mLongitude, mLatitude; + private LoginService loginService; + private TaxiModel() { } @@ -149,6 +147,7 @@ public class TaxiModel { public void init(Context context) { mContext = context.getApplicationContext(); initListeners(); + loginService = (LoginService) ARouter.getInstance().build("/ochbiz/common/login").navigation(); // IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); // apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId()); @@ -193,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() { @@ -248,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(); @@ -261,82 +257,18 @@ public class TaxiModel { } } - /** - * 接单状态和登录状态查询 - * 1、初始化查下状态 - * 2、点击更新接单状态 如果是初始化状态就查下状态 - * 3、点击更新接单状态后 查询状态 - * 4、网络状态波动时 查询状态 - * 5、登出后更新状态 - */ - public void queryCarStatus() { - TaxiServiceManager.getInstance().queryDriverServiceStatus(mContext, - new TaxiServiceCallback() { - @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() { @Override public void onSuccess(BaseData data) { if (null != data && 0 == data.code) { - //StatusManager.changeOrderStatus(); - queryCarStatus(); + loginService.queryLoginStatusByNet(); } } @@ -1002,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(); } } } @@ -1580,30 +1512,6 @@ public class TaxiModel { // 登出 public void logout() { - TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude); - TaxiServiceManager.getInstance().logout(mContext,location4Login, - new TaxiServiceCallback() { - @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); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java index 8b29d4039d..cbb3885cf6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java @@ -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 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 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 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 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 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 queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId - ,@Header("ticket") String ticket,@Query("sn") String sn); - } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java index 333ca64fd9..5c209c7b87 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java @@ -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 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 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 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 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 SubscribeImpl getSubscribeImpl( Context context, TaxiServiceCallback callback, String apiName) { return new SubscribeImpl(RequestOptions.create(context)) { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java index 5bd2c9cb2f..cd1d701673 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java @@ -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 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 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); @@ -113,13 +107,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().jumpPassengerCheckDone(); } - /** - * 登录成功后查询登录状态 - */ - public void queryLoginStatus() { - TaxiModel.getInstance().queryCarStatus(); - } - /** * 司机确认车辆环境可开启自动驾驶 */ @@ -218,25 +205,11 @@ public class TaxiPresenter extends Presenter 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 inServiceList) { @@ -337,4 +310,29 @@ public class TaxiPresenter extends Presenter 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) { + + } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index 955e7d221b..e35ca7e733 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -13,16 +13,13 @@ 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.mogo.commons.debug.DebugConfig; +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.provider.LoginService; import com.mogo.och.taxi.R; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; @@ -59,10 +56,19 @@ public class TaxiFragment extends BaseTaxiTabFragment taxiLoginDialogFragment = null; private WeakReference 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("/ochbiz/common/login").navigation(); + if(loginService!=null){ + loginService.registerFragment(this, getPresenter()); + } + } @Nullable @Override @@ -164,6 +170,8 @@ public class TaxiFragment extends BaseTaxiTabFragment(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; @@ -474,7 +436,6 @@ public class TaxiFragment extends BaseTaxiTabFragment { - 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 -} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp deleted file mode 100644 index 7af7432551edf42ec320de1a5643e49b5d4dc543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44568 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ම{4EGY^_h6bs7t5vjtr`t_) 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 BRHFa@ diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp deleted file mode 100644 index 7af7432551edf42ec320de1a5643e49b5d4dc543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44568 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ම{4EGY^_h6bs7t5vjtr`t_) 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 BRHFa@ diff --git a/OCH/mogo-och-taxi/src/main/res/values/colors.xml b/OCH/mogo-och-taxi/src/main/res/values/colors.xml index 743794b7f8..3aa7cfc710 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/colors.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/colors.xml @@ -25,14 +25,4 @@ #657EE2 - #2961F2 - #14FF0000 - #FF0000 - #666666 - #86A5F7 - #111533 - #878890 - #EF262C - #4D000000 - \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/values/strings.xml b/OCH/mogo-och-taxi/src/main/res/values/strings.xml index b24bdb28d8..1c2e79dfea 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/strings.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/strings.xml @@ -30,17 +30,6 @@ 自动驾驶状态为0不可用 司机端未确认可以开启自动驾驶 - 欢迎您登录 - 登录 - 获取验证码 - 请输入验证码 - 获取验证码成功 - 登录成功 - 请输入正确的手机号 - 请输入正确的验证码 - 请输入手机号 - 请输入手机号 - 网络异常,请稍后重试 请求出现异常,请稍后重试 \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/values/styles.xml b/OCH/mogo-och-taxi/src/main/res/values/styles.xml index ec73feaae9..bd2964b922 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/styles.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/styles.xml @@ -23,22 +23,4 @@ - - \ No newline at end of file From 513df2b96a285715d8e64d0c0fde70bfee9e880f Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 20 Sep 2022 14:26:53 +0800 Subject: [PATCH 04/14] =?UTF-8?q?[2110]=20=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/bus/ui/BusSwitchLineActivity.java | 2 +- .../bus/ui/adapter/SwitchLineTaskAdapter.java | 2 +- .../drawable/bus_switch_line_btn_commit.xml | 24 +++++++------------ .../bus_switch_line_btn_un_commit.xml | 16 ------------- .../res/layout/activity_bus_switch_line.xml | 11 +++++---- 5 files changed, 17 insertions(+), 38 deletions(-) delete mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java index ded9038f14..0b5e58c53c 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java @@ -155,7 +155,7 @@ public class BusSwitchLineActivity extends MvpActivity - - - - - - - - - - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml deleted file mode 100644 index d0ea7fa041..0000000000 --- a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml index 95482563ea..e5d7b2d7f5 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml @@ -50,18 +50,19 @@ + android:background="@drawable/bus_switch_line_btn_commit"/> Date: Tue, 20 Sep 2022 16:00:02 +0800 Subject: [PATCH 05/14] =?UTF-8?q?[2110]=20=E8=B4=A6=E5=8F=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/tools/AutoPilotAndCheckView.kt | 8 ++- .../function/hmi/ui/tools/BusOperationView.kt | 16 +++-- .../res/drawable-xxhdpi/icon_account_head.png | Bin 0 -> 7164 bytes .../main/res/layout/view_auto_pilot_check.xml | 40 +++++++----- .../res/layout/view_och_bus_operation.xml | 60 ++++++++++++------ .../src/main/res/values/strings.xml | 2 +- 6 files changed, 80 insertions(+), 46 deletions(-) create mode 100755 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index 2dc8c466e2..371667ad77 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -160,14 +160,16 @@ class AutoPilotAndCheckView @JvmOverloads constructor( actvLoginout.onClick { EventBus.getDefault().post(EventLogout()) } + actvLoginout.visibility = View.VISIBLE + CallerHmiManager.setBusOperationView(toolBusOperationView) + EventBus.getDefault().post(EventBusOperation(0)) when (DebugConfig.getProductFlavor()) { "fPadLenovoOchTaxi" -> { - actvLoginout.visibility = View.VISIBLE + //出租车司机 } "fPadLenovoOchBus" ->{ - CallerHmiManager.setBusOperationView(toolBusOperationView) - EventBus.getDefault().post(EventBusOperation(0)) + //小巴车司机 } else -> { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt index bfc83e98b9..5eeb8dd0bf 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt @@ -7,6 +7,8 @@ import android.view.View import com.mogo.eagle.core.data.temp.EventBusOperation import com.mogo.eagle.core.function.api.hmi.view.IOchBusView import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ShadowUtils +import com.mogo.eagle.core.utilcode.util.SharedPrefs import kotlinx.android.synthetic.main.view_och_bus_operation.view.* import org.greenrobot.eventbus.EventBus @@ -23,6 +25,9 @@ class BusOperationView @JvmOverloads constructor( init { LayoutInflater.from(context).inflate(R.layout.view_och_bus_operation,this,true) ochBusOperationStatus.setOnClickListener(this) + context?.let { + actvAccountPhone.text = SharedPrefs.getInstance(it).getString("account","") + } } override fun showBusOperation() { @@ -30,10 +35,13 @@ class BusOperationView @JvmOverloads constructor( } override fun changerOperationStatus(isOut: Boolean) { - if (isOut){ - ochBusOperationStatusCTV.text = "收车" - }else{ - ochBusOperationStatusCTV.text = "出车" + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + context?.let { + actvAccountPhone.text = SharedPrefs.getInstance(it).getString("account","") } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png new file mode 100755 index 0000000000000000000000000000000000000000..c9de0b61b99ab6f4d4dbf572b22a52f75626fd06 GIT binary patch literal 7164 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index 88f719956b..fe20f404b3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -17,24 +17,34 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + + app:layout_constraintTop_toBottomOf="@+id/toolBusOperationView" /> + app:layout_constraintStart_toStartOf="@+id/tv_check_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/v_second_group"> + app:layout_constraintStart_toEndOf="@+id/v_second_group" + app:layout_constraintTop_toTopOf="@+id/v_second_group" + app:layout_constraintBottom_toBottomOf="@+id/v_second_group" + /> - - - - - \ No newline at end of file + android:layout_marginTop="40px"/> + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index 44111ae8da..958c053241 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -23,7 +23,7 @@ 调试面板 录包设置 车速设置 - 出收车状态 + 账户信息 系统运行 关机 重启 From 7190b445445cd3b63dd269e9c1e2911e27d1cfda Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 21 Sep 2022 17:57:42 +0800 Subject: [PATCH 06/14] Rename .java to .kt --- .../ui/{BusSwitchLineActivity.java => BusSwitchLineActivity.kt} | 0 .../{SwitchLineTaskAdapter.java => SwitchLineTaskAdapter.kt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/{BusSwitchLineActivity.java => BusSwitchLineActivity.kt} (100%) rename OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/{SwitchLineTaskAdapter.java => SwitchLineTaskAdapter.kt} (100%) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt similarity index 100% rename from OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java rename to OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt similarity index 100% rename from OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java rename to OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt From 93d5bae0b4240ca108dd37bc96507b077e415d02 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 21 Sep 2022 17:57:42 +0800 Subject: [PATCH 07/14] =?UTF-8?q?[2110]=20=E8=B4=A6=E5=8F=B7=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=99=BB=E5=87=BA=E3=80=81=E5=88=87=E6=8D=A2=E8=B7=AF?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/bean/BusQueryLineTaskResponse.java | 19 ++ .../och/bus/bean/BusQueryLinesResponse.java | 4 +- .../bus/bean/BusResetDrivingLineRequest.java | 8 +- .../och/bus/callback/IBusLinesCallback.java | 3 +- .../mogo/och/bus/fragment/BusFragment.java | 32 +- .../com/mogo/och/bus/model/BusLineModel.java | 12 +- .../com/mogo/och/bus/model/BusOrderModel.java | 12 + .../mogo/och/bus/net/BusServiceManager.java | 16 +- .../com/mogo/och/bus/net/IBusApiService.java | 18 +- .../och/bus/presenter/BusLinePresenter.java | 28 +- .../mogo/och/bus/presenter/BusPresenter.java | 19 +- .../mogo/och/bus/ui/BusSwitchLineActivity.kt | 319 ++++++++---------- .../mogo/och/bus/ui/BusSwitchLineView.java | 3 +- .../och/bus/ui/adapter/SwitchLineAdapter.kt | 47 ++- .../bus/ui/adapter/SwitchLineTaskAdapter.kt | 119 +++---- .../biz/bean/DriverStatusQueryRespBean.java | 6 + .../module/biz/constant/OchCommonConst.kt | 2 + .../module/biz/model/OchCommonLoginModel.kt | 4 + .../model/OchCommonLoginStatusDefaultModel.kt | 3 + .../biz/network/OchCommonServiceApiNew.java | 34 +- .../biz/network/OchCommonServiceManager.java | 86 +++-- .../module/biz/provider/LoginServiceImpl.kt | 3 +- .../com/mogo/och/taxi/model/TaxiModel.java | 3 +- .../com/mogo/och/taxi/ui/TaxiFragment.java | 3 +- .../function/hmi/ui/tools/BusOperationView.kt | 20 +- 25 files changed, 517 insertions(+), 306 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java new file mode 100644 index 0000000000..4911c3cf99 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java @@ -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 data; + + public static class Result { + public int id; + public long taskStartTime; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java index 21dd901fc8..17540e3eed 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java @@ -19,9 +19,9 @@ public class BusQueryLinesResponse extends BaseData { public String startSiteName;//始发站名称 public String endSiteName;//终点名称 - public boolean open; + public boolean open;//true 打开状态 false public boolean haveTask; - public List taskList; + public List taskList; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java index c27264694f..6ab70768f9 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java @@ -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; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java index 805a359757..74cac63aa3 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java @@ -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,5 +10,5 @@ import com.mogo.och.bus.bean.BusQueryLinesResponse; public interface IBusLinesCallback { void onBusLinesChange(BusQueryLinesResponse lines); void onChangeLineIdSuccess(); - void onBusLineTasks(BusQueryLinesResponse o, int position); + void onBusLineTasks(BusQueryLineTaskResponse o, int position); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 7278755f1a..b03625c1c7 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -1,17 +1,22 @@ package com.mogo.och.bus.fragment; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; import android.content.Intent; +import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; +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; @@ -27,6 +32,8 @@ import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.presenter.BusPresenter; 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 org.greenrobot.eventbus.Subscribe; @@ -34,8 +41,6 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.List; -import mogo.telematics.pad.MessagePad; - /** * 网约车小巴界面 @@ -59,11 +64,28 @@ public class BusFragment extends BaseBusTabFragment private BusStationBean startStation = null; private BusStationBean endStation = null; + 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(); @@ -101,6 +123,12 @@ public class BusFragment extends BaseBusTabFragment } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void changeOverview(EventLogout eventLogout){ + CallerLogger.INSTANCE.d(M_TAXI + TAG,"changeOverview Event消息去登出"); + mPresenter.logout(); + } + @Override protected void onArriveStation() { mPresenter.onAutopilotArriveAtStation(null); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java index 54014f9f5a..96e3308475 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java @@ -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 @@ -69,9 +72,9 @@ public class BusLineModel { * @param position 位置 */ public void queryBusLineTasksById(int lineId, int position){ - BusServiceManager.getInstance().queryBusLines(mContext, new IBusServiceCallback() { + BusServiceManager.getInstance().queryBusTaskByLineId(mContext, String.valueOf(lineId),new IBusServiceCallback() { @Override - public void onSuccess(BusQueryLinesResponse data) { + public void onSuccess(BusQueryLineTaskResponse data) { if (null == data && mBusLinesCallback != null) { mBusLinesCallback.onBusLineTasks(null,position); return; @@ -93,10 +96,11 @@ public class BusLineModel { }); } - public void commitSwitchLineId(int lineId){ - BusServiceManager.getInstance().switchLine(mContext,lineId, new IBusServiceCallback() { + public void commitSwitchLineId(int taskId,int lineId){ + BusServiceManager.getInstance().switchLine(mContext,taskId, new IBusServiceCallback() { @Override public void onSuccess(BusRoutesResponse o) { + SharedPrefs.getInstance(mContext).putInt(BusSwitchLineActivity.LASTCOMMITLINEID,lineId); if (mBusLinesCallback != null){ mBusLinesCallback.onChangeLineIdSuccess(); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java index f8e5b3bd17..3294442a68 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java @@ -14,6 +14,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; @@ -53,6 +54,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.PinYinUtil; import com.mogo.service.statusmanager.IMogoStatusChangedListener; @@ -116,6 +119,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) { @@ -144,6 +149,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")) { @@ -351,6 +357,7 @@ public class BusOrderModel { //自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); + loginService = null; } private Object readResolve() { @@ -998,6 +1005,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; diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java index 44284cb122..a35c16e7bf 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java @@ -10,6 +10,7 @@ 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.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.BusResetLineStatusRequest; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; @@ -72,12 +73,12 @@ public class BusServiceManager { /** * 重置线路站点 * @param context - * @param lineId + * @param taskId * @param callback */ - public void switchLine(Context context, int lineId, IBusServiceCallback callback){ + public void switchLine(Context context, int taskId, IBusServiceCallback 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")); } @@ -211,6 +212,15 @@ public class BusServiceManager { .subscribe(getSubscribeImpl(context,callback,"queryBusLines")); } + public void queryBusTaskByLineId(Context context,String lineId,IBusServiceCallback 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 callback){ diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index 291fb9f67f..9501ae03a5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -2,6 +2,7 @@ package com.mogo.och.bus.net; import com.mogo.eagle.core.data.BaseData; 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.BusResetLineStatusRequest; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; @@ -45,11 +46,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 switchLine(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetDrivingLineRequest request); /** @@ -142,10 +142,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 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 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 updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java index 5fb1485874..7f1a70a0d1 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java @@ -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 implements IBusLinesCallback { + private Disposable subscribe; + public BusLinePresenter(BusSwitchLineView view) { super(view); BusLineModel.getInstance().init(); @@ -61,12 +69,21 @@ public class BusLinePresenter extends Presenter implements IB BusLineModel.getInstance().queryBusLines(); } - public void queryBusLineTasks(int lineId, int position){ + 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 lineId){ - BusLineModel.getInstance().commitSwitchLineId(lineId); + public void commitSwitchLineId(int taskId,int lineId){ + BusLineModel.getInstance().commitSwitchLineId(taskId,lineId); } public void removeListener(){ @@ -80,11 +97,14 @@ public class BusLinePresenter extends Presenter implements IB @Override public void onDestroy(@NonNull LifecycleOwner owner) { super.onDestroy(owner); + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } } @Override - public void onBusLineTasks(BusQueryLinesResponse o, int position) { + public void onBusLineTasks(BusQueryLineTaskResponse o, int position) { mView.onBusLineTasks(o,position); } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index 15b161f032..126a97dd83 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -24,6 +24,8 @@ import com.mogo.och.bus.callback.ISlidePannelHideCallback; 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 org.jetbrains.annotations.NotNull; @@ -41,7 +43,7 @@ import system_master.SystemStatusInfo; */ public class BusPresenter extends Presenter implements ICarOperationStatusCallback, IRefreshBusStationsCallback, ISlidePannelHideCallback - , IMoGoAutopilotStatusListener, IBusControllerStatusCallback { + , IMoGoAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback { private static final String TAG = "BusPresenter"; @@ -116,6 +118,11 @@ public class BusPresenter extends Presenter BusOrderModel.getInstance().onChangeOperationStatus(); } + // 登出 + public void logout() { + BusOrderModel.getInstance().logout(); + } + @Override public void changeOperationStatus(boolean changeStatus) { if (mView != null) { @@ -295,4 +302,14 @@ public class BusPresenter extends Presenter public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { } + + @Override + public void loginSuccess(DriverStatusQueryRespBean data) { + + } + + @Override + public void loginFail(boolean isLogin) { + + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt index 0b5e58c53c..976bc2711e 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt @@ -1,233 +1,210 @@ -package com.mogo.och.bus.ui; +package com.mogo.och.bus.ui -import android.content.Context; -import android.graphics.Point; -import android.os.Bundle; -import android.view.Gravity; -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.module.common.view.SpacesItemDecoration; -import com.mogo.och.bus.R; -import com.mogo.och.bus.bean.BusQueryLinesResponse; -import com.mogo.och.bus.presenter.BusLinePresenter; -import com.mogo.och.bus.ui.adapter.OpenItemAnimator; -import com.mogo.och.bus.ui.adapter.SwitchLineAdapter; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import io.reactivex.Observable; -import io.reactivex.disposables.Disposable; +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 */ -public class BusSwitchLineActivity extends MvpActivity - implements View.OnClickListener, BusSwitchLineView { +class BusSwitchLineActivity : MvpActivity(), + View.OnClickListener, BusSwitchLineView { - private ImageView mClose; - private ConstraintLayout mNoDatasView; - private RecyclerView mLinesListView; - private TextView mLineCommitBtn; - private SwitchLineAdapter mAdapter; - private List mData = new ArrayList<>(); - private int mSelectLineId = -1; - - private Disposable subscribe; - - @Override - protected int getLayoutId() { - return R.layout.activity_bus_switch_line; + companion object{ + const val LASTCOMMITLINEID = "lastcommitlineid" } - @NonNull - @Override - protected BusLinePresenter createPresenter() { - return new BusLinePresenter(this); + private lateinit var mClose: ImageView + private lateinit var mNoDatasView: ConstraintLayout + private lateinit var mLinesListView: RecyclerView + private lateinit var mLineCommitBtn: TextView + private lateinit var mAdapter: SwitchLineAdapter + private lateinit var linearLayoutManager:LinearLayoutManager + private val mData: MutableList = ArrayList() + override fun getLayoutId(): Int { + return R.layout.activity_bus_switch_line } - @Override - protected void initViews() { - initWH(); - initView(); + override fun createPresenter(): BusLinePresenter { + return BusLinePresenter(this) } - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - initDatas(); + override fun initViews() { + initWH() + initView() + } + + override fun onCreate(savedInstanceState: Bundle?) { + 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)); - mLinesListView.setItemAnimator(new OpenItemAnimator()); - mAdapter = new SwitchLineAdapter(getApplicationContext(),mData); - mLinesListView.addItemDecoration(new SpacesItemDecoration(4)); - mLinesListView.setAdapter(mAdapter); + 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((position) -> { - mPresenter.queryBusLineTasks(mData.get(position).lineId,position); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); + mAdapter.setOnLineItemClickListener(object :SwitchLineAdapter.LineItemClickListener{ + override fun onItemClick(position: Int, close: Boolean) { + mPresenter?.queryBusLineTasks(mData[position].lineId, position, close) } - subscribe = Observable.timer(3, TimeUnit.MINUTES).subscribe(aLong -> { - mPresenter.queryBusLineTasks(mData.get(position).lineId,position); - }); - }); + }) } /** * 设置布局宽高 */ - 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 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 void initDatas() { - mPresenter.queryBusLines(); + private fun initDatas() { + mPresenter?.queryBusLines() } /** * 查询返回绑定路线集合 * @param data */ - @Override - public void onBusLinesChange(BusQueryLinesResponse data){ - if (null == data){ - showNoData(true); - return; + override fun onBusLinesChange(data: BusQueryLinesResponse?) { + 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); + 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) } } - /** - * 根据路线选中情况设置提交按钮样式 - */ - private void changeCommitBtnBg() { - for (int i=0; i(); - } - if(o.data.size()!=result.taskList.size()) {// 不相等有变动 重新赋值 - result.taskList.clear(); - if (position % 3 != 0) { - result.taskList.addAll(o.data); - result.haveTask = false; - } else { - result.haveTask = true; + 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) } } - mAdapter.notifyItemChanged(position); } /** * 有无数据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); + 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 - public void onClick(View v) { + override fun onClick(v: View) { //关闭dialog - if (v.getId() == R.id.switch_line_close){ - finish(); - return; + if (v.id == R.id.switch_line_close) { + finish() + return } //切换路线提交 - if (v.getId() == R.id.switch_line_btn_commit){ - if (mSelectLineId > -1){ - mPresenter.commitSwitchLineId(mSelectLineId); - }else { - finish(); + 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 - protected void onDestroy() { - super.onDestroy(); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); - } + override fun onDestroy() { + mPresenter!!.removeListener() + super.onDestroy() } -} +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java index 14309a101f..e71474dcc7 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java @@ -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; /** @@ -12,6 +13,6 @@ public interface BusSwitchLineView extends IView { void onBusLinesChange(BusQueryLinesResponse data); void onChangeLineIdSuccess(); - void onBusLineTasks(BusQueryLinesResponse o, int position); + void onBusLineTasks(BusQueryLineTaskResponse o, int position); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt index 45f0d1b1fb..c6dd0640e5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt @@ -24,6 +24,8 @@ class SwitchLineAdapter( } // RecyclerView设置点击事件 private var mItemClickListener: LineItemClickListener? = null + var checkLineId:Int = -1 + var checkTaskId:Int = -1 override fun onCreateViewHolder( parent: ViewGroup, viewType: Int @@ -40,11 +42,21 @@ class SwitchLineAdapter( 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, - line.taskList - ) + 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 @@ -95,18 +107,19 @@ class SwitchLineAdapter( if(holder.actvShowMore.text==mContext.getString(R.string.bus_switch_line_no_task)){ return@setOnClickListener } - closeOther() - mItemClickListener?.onItemClick(currentPosition) - line.open = holder.rvLineTask.visibility == View.GONE - } - } - - private fun closeOther() { - mData.forEachIndexed { index, result -> - if(result.open){ - result.open = false; - notifyItemChanged(index) + mData.forEachIndexed { index, result -> + if(result.open){ + result.open = false; + notifyItemChanged(index) + result.taskList.clear() + if(index==currentPosition){// 点击当前已经打开的item 去关闭定时网络请求 + mItemClickListener?.onItemClick(currentPosition,true) + return@setOnClickListener + } + } } + mItemClickListener?.onItemClick(currentPosition,false) + line.open = holder.rvLineTask.visibility == View.GONE } } @@ -137,6 +150,6 @@ class SwitchLineAdapter( } interface LineItemClickListener { - fun onItemClick(position: Int) + fun onItemClick(position: Int,close:Boolean) } } \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt index c4abd05426..8183e0efd4 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt @@ -1,73 +1,76 @@ -package com.mogo.och.bus.ui.adapter; +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.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.mogo.och.bus.R; -import com.mogo.och.bus.bean.BusQueryLinesResponse; - -import java.util.List; +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 */ -public class SwitchLineTaskAdapter extends RecyclerView.Adapter { - - private Context mContext; - private List mData; - - public SwitchLineTaskAdapter(Context context, List data) { - mContext = context; - mData = data; +class SwitchLineTaskAdapter( + private val mContext: Context, + private var checkTaskId:Int, + private val mData: List?, + private val mTaskItemClickListener: TaskItemClickListener? +) : RecyclerView.Adapter() { + 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) } - @NonNull - @Override - public SwitchLineTaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(mContext).inflate(R.layout.bus_switch_line_list_task_item - , parent, false); - return new SwitchLineTaskViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull SwitchLineTaskViewHolder holder, int position) { - int currentPosition = holder.getBindingAdapterPosition(); - BusQueryLinesResponse.Result line = mData.get(currentPosition); - holder.lineTask.setText("13:40"); - holder.lineTask.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - + 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) } - }); - } - - @Override - public int getItemCount() { - return mData==null?0:mData.size(); - } - - static class SwitchLineTaskViewHolder extends RecyclerView.ViewHolder { - - private TextView lineTask; // 时间 - - public SwitchLineTaskViewHolder(@NonNull View itemView) { - super(itemView); - lineTask = itemView.findViewById(R.id.actv_line_task); + notifyItemChanged(currentPosition) } } - public interface LineItemClickListener { - void onItemClick(int position) ; + 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) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java index 903fece224..e7a3138fd1 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java @@ -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 String lineId;//线路id + public String taskId;//任务id } } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt index 55a0b5cc2a..6e1891710e 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt @@ -24,5 +24,7 @@ class OchCommonConst { // token 失效 重新获取token const val WAIT_TAKEN = 100046 + const val LOGINSERVICE = "/ochbiz/common/login" + } } \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt index 08f1acc43f..b9874084bc 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt @@ -4,6 +4,7 @@ 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.eagle.core.utilcode.util.SharedPrefs import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.map.navi.IMogoCarLocationChangedListener2 import com.mogo.module.common.MogoApisHandler @@ -106,6 +107,9 @@ object OchCommonLoginModel{ // 获取验证码成功 ToastUtils.showShort(mContext?.getString(R.string.module_och_taxi_login_login_success)) LoginStatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) + mContext?.let { + SharedPrefs.getInstance(it).putString("och_account",phone) + } iTaxiLoginCallback?.loginSuccess() } else { if (data != null) { diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt index c935981982..10348b6b2b 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt @@ -3,6 +3,7 @@ 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 @@ -21,8 +22,10 @@ object OchCommonLoginStatusDefaultModel : OchCommonLoginStatusModel() { 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) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java index da32fc85be..d31f624578 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java @@ -12,6 +12,7 @@ import retrofit2.http.GET; import retrofit2.http.Header; import retrofit2.http.Headers; import retrofit2.http.POST; +import retrofit2.http.Path; import retrofit2.http.Query; /** @@ -26,7 +27,6 @@ interface OchCommonServiceApiNew { * @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 getPhoneCode(@Header("appId") String appId , @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data); @@ -39,25 +39,43 @@ interface OchCommonServiceApiNew { */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" ) - Observable gotoLoginBycode(@Header("appId") String appId + Observable 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 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 logout(@Header("appId") String appId, @Header("ticket") String ticket, + Observable 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 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/api/v1/driver/serviceStatus/query" ) - @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" ) - Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId - ,@Header("ticket") String ticket,@Query("sn") String sn); + @GET( "/autopilot-car-hailing/operation/v1/driver/{flavor}/loginStatus") + Observable queryDriverServiceStatusAndLoginStatus(@Path(value = "flavor",encoded = true) String flavor,@Header ("appId") String appId + , @Header("ticket") String ticket, @Query("sn") String sn); } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java index 668f781253..ecc0129cfe 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java @@ -6,6 +6,7 @@ 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; @@ -18,6 +19,7 @@ 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; @@ -48,8 +50,8 @@ public class OchCommonServiceManager { * @param context * @param callback */ - public void getPhoneCode(Context context,String phone, - OchCommonServiceCallback callback) { + public void getPhoneCode(Context context, String phone, + OchCommonServiceCallback callback) { mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() , MoGoAiCloudClientConfig.getInstance().getToken() , new TaxiLoginSmsReqBean(phone)) @@ -66,56 +68,98 @@ public class OchCommonServiceManager { TaxiLoginReqBean.Location4Login location4Login, OchCommonServiceCallback callback) { String sn = MoGoAiCloudClientConfig.getInstance().getSn(); - mOCHTaxiServiceApi.gotoLoginBycode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + Observable taxiLoginRespBeanObservable = null; + switch (DebugConfig.getProductFlavor()) { + case "fPadLenovoOchTaxi": {//出租车司机 + taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Taxi(MoGoAiCloudClientConfig.getInstance().getServiceAppId() , MoGoAiCloudClientConfig.getInstance().getToken() - , new TaxiLoginReqBean(phone, code, sn, location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); + , 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 callback) { - mOCHTaxiServiceApi.logout( + Observable logout = null; + switch (DebugConfig.getProductFlavor()) { + case "fPadLenovoOchTaxi": {//出租车司机 + logout = mOCHTaxiServiceApi.logout4Taxi( MoGoAiCloudClientConfig.getInstance().getServiceAppId(), MoGoAiCloudClientConfig.getInstance().getToken(), - new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "logout")); + 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 callback) { - if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){ - callback.onFail(OchCommonConst.WAIT_TAKEN,"等待令牌中请稍等"); + if (MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()) { + callback.onFail(OchCommonConst.WAIT_TAKEN, "等待令牌中请稍等"); MoGoAiCloudClient.getInstance().refreshToken(); return; } - mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,MoGoAiCloudClientConfig.getInstance().getSn()) + 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 SubscribeImpl getSubscribeImpl( Context context, OchCommonServiceCallback callback, String apiName) { return new SubscribeImpl(RequestOptions.create(context)) { @Override public void onSuccess(T o) { super.onSuccess(o); - CallerLogger.INSTANCE.d(M_TAXI + TAG,apiName + ": onSuccess() " + o.msg); + CallerLogger.INSTANCE.d(M_TAXI + TAG, apiName + ": onSuccess() " + o.msg); if (callback != null) { callback.onSuccess(o); } @@ -124,7 +168,7 @@ public class OchCommonServiceManager { @Override public void onError(Throwable e) { super.onError(e); - CallerLogger.INSTANCE.e(M_TAXI + TAG,apiName + ": onError() " + e.getMessage()); + CallerLogger.INSTANCE.e(M_TAXI + TAG, apiName + ": onError() " + e.getMessage()); if (callback != null) { callback.onError(); } @@ -133,7 +177,7 @@ public class OchCommonServiceManager { @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)); + CallerLogger.INSTANCE.e(M_TAXI + TAG, String.format(apiName + ": onError() code = %d; message = %s;", code, message)); if (callback != null) { callback.onFail(code, message); } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt index dcbe881200..352fa57e6b 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt @@ -12,12 +12,13 @@ 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 = "/ochbiz/common/login") +@Route(path = OchCommonConst.LOGINSERVICE) class LoginServiceImpl : LoginService,ILoginViewCallback { companion object{ diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index dc0f367ad6..e515c4e397 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -36,6 +36,7 @@ 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; @@ -147,7 +148,7 @@ public class TaxiModel { public void init(Context context) { mContext = context.getApplicationContext(); initListeners(); - loginService = (LoginService) ARouter.getInstance().build("/ochbiz/common/login").navigation(); + loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); // IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); // apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId()); diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index e35ca7e733..fba6c4b394 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -19,6 +19,7 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.eagle.core.data.temp.EventLogout; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; 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; @@ -64,7 +65,7 @@ public class TaxiFragment extends BaseTaxiTabFragment Date: Wed, 21 Sep 2022 19:10:21 +0800 Subject: [PATCH 08/14] =?UTF-8?q?[Change]=20A=E3=80=81=E5=B0=86=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E4=BF=A1=E6=81=AF=E5=9B=9E=E8=B0=83=E7=94=B1=E9=AB=98?= =?UTF-8?q?=E7=B2=BE=E5=9C=B0=E5=9B=BE=E5=9B=9E=E8=B0=83=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=B8=BA=E7=9B=B4=E6=8E=A5=E5=B0=86=E5=B7=A5=E6=8E=A7?= =?UTF-8?q?=E6=9C=BA=E6=95=B0=E6=8D=AE=E5=9B=9E=E8=B0=83=E7=BB=99=E5=90=84?= =?UTF-8?q?=E4=B8=AA=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: donghongyu --- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 253 ++++++++++-------- .../java/com/mogo/map/AMapViewWrapper.java | 13 +- 2 files changed, 136 insertions(+), 130 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index 9174f7da53..d43b686d7e 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -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?) @@ -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,26 +129,41 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map(gnssInfo) // 同步更新经纬度和系统时间至 AutoPilotStatusListener CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( - gnssInfo.satelliteTime, - gnssInfo.longitude, - gnssInfo.latitude + gnssInfo.satelliteTime, + gnssInfo.longitude, + gnssInfo.latitude ) + + // 直接将工控机惯导数据同步给各个模块 + val sysLocation = Location("GNSS") + sysLocation.altitude = gnssInfo.altitude + sysLocation.latitude = gnssInfo.latitude + sysLocation.longitude = gnssInfo.longitude + sysLocation.provider = "GNSS" + sysLocation.accuracy = gnssInfo.acceleration.toFloat() + sysLocation.time = gnssInfo.satelliteTime.toLong() + sysLocation.bearing = gnssInfo.heading.toFloat() + sysLocation.speed = gnssInfo.gnssSpeed.toFloat() + + if (MogoCarLocationChangedListenerRegister.getInstance().listener != null) { + MogoCarLocationChangedListenerRegister.getInstance().listener.onCarLocationChanged2(sysLocation) + } } } } //自车状态(底盘),车灯等。 @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 +189,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 +233,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 +251,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 +289,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) @@ -289,24 +306,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 +335,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 +353,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 +384,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 +402,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 +420,8 @@ class MoGoAdasListenerImpl : OnAdasListener { * 数据采集配置应答 */ override fun onRecordDataConfigResp( - header: MessagePad.Header?, - config: MessagePad.RecordDataConfig? + header: MessagePad.Header?, + config: MessagePad.RecordDataConfig? ) { } @@ -413,16 +430,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) diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index fa71aec7a7..8c47f680c6 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -744,15 +744,6 @@ public class AMapViewWrapper implements IMogoMapView, mainHandler.removeCallbacks(mLocationTask); mainHandler.post(mLocationTask); } - Location sysLocation = new Location(location.getProvider()); - sysLocation.setAltitude(location.getAltitude()); - sysLocation.setLatitude(location.getLat()); - sysLocation.setLongitude(location.getLon()); - sysLocation.setProvider(location.getProvider()); - sysLocation.setAccuracy(location.getAcceleration()); - sysLocation.setTime(location.duration); - sysLocation.setBearing((float) location.getHeading()); - sysLocation.setSpeed(location.getSpeed()); // 将有效经纬度暂存本地,提供给下一次的Http-DNS使用,防止首次请求位置获取不到 if (location.getLat() > 0 && location.getLon() > 0) { @@ -766,9 +757,7 @@ public class AMapViewWrapper implements IMogoMapView, .putString(SharedPrefsConstants.LOCATION_LONGITUDE, String.valueOf(location.getLon())); } - if (MogoCarLocationChangedListenerRegister.getInstance().getListener() != null) { - MogoCarLocationChangedListenerRegister.getInstance().getListener().onCarLocationChanged2(sysLocation); - } + if (checkAMapView() && mMapLoaded) { // 地图初始化完成后,每隔5s自动判断当前地图的模式 if (mIsFirstLocated) { From 43ea5777e1687d0be31aaacfd64d4e82bf629537 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Wed, 21 Sep 2022 19:23:27 +0800 Subject: [PATCH 09/14] =?UTF-8?q?[Change]=20A=E3=80=81=E8=BF=98=E5=8E=9F?= =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: donghongyu --- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 15 --------------- .../main/java/com/mogo/map/AMapViewWrapper.java | 13 +++++++++++++ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index d43b686d7e..65d1aa08fa 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -133,21 +133,6 @@ class MoGoAdasListenerImpl : OnAdasListener { gnssInfo.longitude, gnssInfo.latitude ) - - // 直接将工控机惯导数据同步给各个模块 - val sysLocation = Location("GNSS") - sysLocation.altitude = gnssInfo.altitude - sysLocation.latitude = gnssInfo.latitude - sysLocation.longitude = gnssInfo.longitude - sysLocation.provider = "GNSS" - sysLocation.accuracy = gnssInfo.acceleration.toFloat() - sysLocation.time = gnssInfo.satelliteTime.toLong() - sysLocation.bearing = gnssInfo.heading.toFloat() - sysLocation.speed = gnssInfo.gnssSpeed.toFloat() - - if (MogoCarLocationChangedListenerRegister.getInstance().listener != null) { - MogoCarLocationChangedListenerRegister.getInstance().listener.onCarLocationChanged2(sysLocation) - } } } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index 8c47f680c6..6a64322c93 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -757,7 +757,20 @@ public class AMapViewWrapper implements IMogoMapView, .putString(SharedPrefsConstants.LOCATION_LONGITUDE, String.valueOf(location.getLon())); } + // 同步给各个模块 + Location sysLocation = new Location(location.getProvider()); + sysLocation.setAltitude(location.getAltitude()); + sysLocation.setLatitude(location.getLat()); + sysLocation.setLongitude(location.getLon()); + sysLocation.setProvider(location.getProvider()); + sysLocation.setAccuracy(location.getAcceleration()); + sysLocation.setTime(location.duration); + sysLocation.setBearing((float) location.getHeading()); + sysLocation.setSpeed(location.getSpeed()); + if (MogoCarLocationChangedListenerRegister.getInstance().getListener() != null) { + MogoCarLocationChangedListenerRegister.getInstance().getListener().onCarLocationChanged2(sysLocation); + } if (checkAMapView() && mMapLoaded) { // 地图初始化完成后,每隔5s自动判断当前地图的模式 if (mIsFirstLocated) { From 87f34a6dbcbc2c2ee5615b18e10f7a9809500f24 Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 22 Sep 2022 09:46:02 +0800 Subject: [PATCH 10/14] =?UTF-8?q?[=E7=BA=BF=E7=A8=8B=E4=BC=98=E5=8C=96]?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 18 ++--- .../com/mogo/launcher/MogoApplication.java | 70 ++++++++++--------- build.gradle | 2 +- 3 files changed, 47 insertions(+), 43 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d7334c8151..afb3ab9496 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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()) { // /** diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index c472f0a6d4..ee39bc7a34 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -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 diff --git a/build.gradle b/build.gradle index 786ea8b61e..a1ad739077 100644 --- a/build.gradle +++ b/build.gradle @@ -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' From 26c44b3ed7186fd3caf2578260825941675c125d Mon Sep 17 00:00:00 2001 From: yangyakun Date: Thu, 22 Sep 2022 10:51:41 +0800 Subject: [PATCH 11/14] =?UTF-8?q?[2110]=20=E5=88=A0=E9=99=A4=E6=94=B6?= =?UTF-8?q?=E8=BD=A6=E5=87=BA=E8=BD=A6(=E6=A0=B7=E5=BC=8F=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E8=B4=A6=E5=8F=B7=E4=BF=A1=E6=81=AF)=E3=80=81?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E4=BB=BB=E5=8A=A1=E9=9D=A2=E6=9D=BF=E4=B8=80?= =?UTF-8?q?=E7=9B=B4=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/bean/BusOperationStatusResponse.java | 20 ---- .../callback/ICarOperationStatusCallback.java | 9 -- .../callback/IRefreshBusStationsCallback.java | 3 + .../bus/constant/LineAndTaskStatusManager.kt | 21 ++++ .../och/bus/fragment/BaseBusTabFragment.java | 24 +--- .../mogo/och/bus/fragment/BusFragment.java | 46 +------- .../com/mogo/och/bus/model/BusOrderModel.java | 111 +----------------- .../mogo/och/bus/net/BusServiceManager.java | 43 ------- .../com/mogo/och/bus/net/IBusApiService.java | 36 +----- .../mogo/och/bus/presenter/BusPresenter.java | 39 +++--- .../och/bus/util/BusTrajectoryManager.java | 4 +- .../src/main/res/layout/bus_base_fragment.xml | 3 +- .../biz/bean/DriverStatusQueryRespBean.java | 4 +- .../core/function/hmi/ui/MoGoHmiFragment.kt | 5 - .../hmi/ui/tools/AutoPilotAndCheckView.kt | 2 - .../function/hmi/ui/tools/BusOperationView.kt | 8 +- .../eagle/core/data/temp/EventBusOperation.kt | 10 -- .../api/hmi/warning/IMoGoWaringProvider.kt | 2 - .../function/call/hmi/CallerHmiManager.kt | 7 -- 19 files changed, 54 insertions(+), 343 deletions(-) delete mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java delete mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt delete mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventBusOperation.kt diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java deleted file mode 100644 index 744fbac9c5..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java +++ /dev/null @@ -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:已出车 - - } -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java deleted file mode 100644 index d414f71e2c..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.mogo.och.bus.callback; - -/** - * @author: wangmingjun - * @date: 2021/10/22 - */ -public interface ICarOperationStatusCallback { - void changeOperationStatus(boolean changeStatus); -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java index 758fd4b0bf..95292ef6a6 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java @@ -14,6 +14,9 @@ public interface IRefreshBusStationsCallback { int arrivingOrArrivedIndex, boolean isArrived); + /** + * 结束清理一遍、选择任务后清理一遍 + */ void clearBusStationsMarkers(); void updateEmptyUi(); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt new file mode 100644 index 0000000000..577445a2d6 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt @@ -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 + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index adbbf2c0eb..9a33fcdc06 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -111,8 +111,6 @@ public abstract class BaseBusTabFragment 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 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 MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoMapListener(TYPE_ENTRANCE, this); } - protected void onChangeOperationStatus() { - - } - /** * 展示滑动按钮 * @@ -428,22 +422,6 @@ public abstract class BaseBusTabFragment }); } - 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; } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 18a181d217..0e7cda6b4d 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -16,7 +16,6 @@ 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; @@ -110,19 +109,9 @@ public class BusFragment extends BaseBusTabFragment mSwitchLine.setOnClickListener(this); } - @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(); - } - } - @Subscribe(threadMode = ThreadMode.MAIN) public void changeOverview(EventLogout eventLogout){ - CallerLogger.INSTANCE.d(M_TAXI + TAG,"changeOverview Event消息去登出"); + CallerLogger.INSTANCE.d(M_BUS + TAG,"changeOverview Event消息去登出"); mPresenter.logout(); } @@ -415,37 +404,6 @@ public class BusFragment extends BaseBusTabFragment } } - @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) { @@ -550,7 +508,7 @@ public class BusFragment extends BaseBusTabFragment @Override public void cancel() { - + closeLineConfirmDialog.dismiss(); } }); closeLineConfirmDialog.show(); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java index fe20a774b9..317e28566e 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java @@ -31,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; @@ -45,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; @@ -89,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; @@ -110,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->Presenter:VR mode等 @@ -209,10 +202,6 @@ public class BusOrderModel { startLoopBusOrders(); } - public void setCarOperationStatusCallback(ICarOperationStatusCallback callback){ - this.carOperationStatusCallback = callback; - } - public void setRefreshBusStationsCallback(IRefreshBusStationsCallback callback){ this.refreshBusStationsCallback = callback; } @@ -718,34 +707,10 @@ public class BusOrderModel { }); } - /** - * 收车 - */ - public void stopTakeOrder(){ - BusServiceManager.getInstance().stopTakeOrder(mContext, new IBusServiceCallback() { - @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); @@ -754,60 +719,6 @@ public class BusOrderModel { } } - /** - * 出车 - */ - public void startTakeOrder(){ - BusServiceManager.getInstance().startTakeOrder(mContext, new IBusServiceCallback() { - @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() { - @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); - } - } - }); - } - /** * 开启自动驾驶到下一站 */ @@ -967,18 +878,6 @@ public class BusOrderModel { AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() ); } - /** - * 修改小巴运营状态 - */ - public void onChangeOperationStatus() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "修改小巴运营状态"); - if (isWorking()){//收车 - stopTakeOrder(); - }else {//出车 - startTakeOrder(); - } - } - /** * 行程结束 */ @@ -994,10 +893,6 @@ public class BusOrderModel { leaveStation(true,true); } - public boolean isWorking() { - return mIsWorking; - } - /** * 到站 * @param data @@ -1052,7 +947,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(); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java index a35c16e7bf..b41c1a03b6 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java @@ -16,8 +16,6 @@ import com.mogo.och.bus.bean.BusResetLineStatusRequest; 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; @@ -147,48 +145,7 @@ public class BusServiceManager { .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers")); } - /** - * 收车 - * @param context - * @param callback - */ - public void stopTakeOrder(Context context, IBusServiceCallback 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 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 callback){ - mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn()) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus")); - } /** * 查询小巴车订单 diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index 9501ae03a5..35f011cd17 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -9,7 +9,6 @@ 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; @@ -86,39 +85,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 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 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 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") @@ -161,7 +127,7 @@ public interface IBusApiService { Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data); @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST("/autopilot-car-hailing/operation/v1/driver/bus/line/resetStart") + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask") Observable resetCurrentLineStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetLineStatusRequest data); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index 0f0c561539..22855144e0 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -17,15 +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; @@ -42,7 +43,7 @@ import system_master.SystemStatusInfo; * @author tongchenfei */ public class BusPresenter extends Presenter - implements ICarOperationStatusCallback, IRefreshBusStationsCallback, ISlidePannelHideCallback + implements IRefreshBusStationsCallback, ISlidePannelHideCallback , IMoGoAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback { private static final String TAG = "BusPresenter"; @@ -62,7 +63,6 @@ public class BusPresenter extends Presenter @Override public void onCreate(@NonNull LifecycleOwner owner) { super.onCreate(owner); - queryOperationStatus(); BusOrderModel.getInstance().queryBusRoutes(); initModelListener(); } @@ -75,14 +75,12 @@ public class BusPresenter extends Presenter } 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); @@ -92,10 +90,6 @@ public class BusPresenter extends Presenter BusOrderModel.getInstance().queryBusRoutes(); } - public void queryOperationStatus(){ - BusOrderModel.getInstance().queryOperationStatus(); - } - public void resetCurrentLineStatus() { BusOrderModel.getInstance().resetCurrentLineStatus(); } @@ -114,22 +108,11 @@ public class BusPresenter extends Presenter } } - public void onChangeOperationStatus() { - BusOrderModel.getInstance().onChangeOperationStatus(); - } - // 登出 public void logout() { BusOrderModel.getInstance().logout(); } - @Override - public void changeOperationStatus(boolean changeStatus) { - if (mView != null) { - runOnUIThread(() -> mView.changeOperationStatus(changeStatus)); - } - } - // @Override // public void refreshBusStations(String lineName,List stationList // , int currentStation, int nextStation, boolean isArrived) { @@ -326,10 +309,22 @@ public class BusPresenter extends Presenter 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 diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java index 85654e2853..94ad2be2d1 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java @@ -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."); diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml index 3cd819092e..a79d337496 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml @@ -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" /> (), mViewNotificationProvider = provider } - - override fun changeBusOperationStatus(isOut: Boolean) { - busOperationStatus?.changerOperationStatus(isOut) - } - override fun setBusOperationView(view: IOchBusView) { busOperationStatus = view busOperationStatus?.showBusOperation() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index c71b7541ee..26c294afd6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -14,7 +14,6 @@ import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo -import com.mogo.eagle.core.data.temp.EventBusOperation import com.mogo.eagle.core.data.temp.EventLogout import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener @@ -162,7 +161,6 @@ class AutoPilotAndCheckView @JvmOverloads constructor( } actvLoginout.visibility = View.VISIBLE CallerHmiManager.setBusOperationView(toolBusOperationView) - EventBus.getDefault().post(EventBusOperation(0)) when (DebugConfig.getProductFlavor()) { "fPadLenovoOchTaxi" -> { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt index 4c4a5b966b..37709763dd 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt @@ -4,7 +4,6 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View -import com.mogo.eagle.core.data.temp.EventBusOperation import com.mogo.eagle.core.function.api.hmi.view.IOchBusView import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.util.SharedPrefs @@ -20,11 +19,10 @@ class BusOperationView @JvmOverloads constructor( context: Context?, attrs: AttributeSet? = null, defStyleAttr: Int = 0) - : IOchBusView(context, attrs, defStyleAttr), View.OnClickListener { + : IOchBusView(context, attrs, defStyleAttr) { init { LayoutInflater.from(context).inflate(R.layout.view_och_bus_operation,this,true) - ochBusOperationStatus.setOnClickListener(this) context?.let { actvAccountPhone.text = SharedPrefs.getInstance(it).getString("account","") } @@ -45,10 +43,6 @@ class BusOperationView @JvmOverloads constructor( } } - override fun onClick(v: View?) { - EventBus.getDefault().post(EventBusOperation(1)) - } - /** * 用户电话号码的打码隐藏加星号加* diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventBusOperation.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventBusOperation.kt deleted file mode 100644 index 3aefda4737..0000000000 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventBusOperation.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.mogo.eagle.core.data.temp - -/** - * @author: wangmingjun - * @date: 2022/8/23 - */ -class EventBusOperation constructor(var id:Int -) { - -} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt index 5921a99347..61b818993d 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt @@ -257,7 +257,5 @@ interface IMoGoWaringProvider : IMoGoHmiViewProxy { fun showVideoDialog(infList: List) - fun changeBusOperationStatus(isOut:Boolean) - fun setBusOperationView(view:IOchBusView) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index 2f8411528c..4b81da2533 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -397,13 +397,6 @@ object CallerHmiManager : CallerBase() { waringProviderApi?.showVideoDialog(infList) } - /** - * bus出车/收车状态设置 - * true : 显示收车; false:显示出车 - */ - fun changeBusOperationStatus(isOut: Boolean) { - waringProviderApi?.changeBusOperationStatus(isOut) - } /** * 设置 bus出车/收车View From 9f2e3ebcafce858b09ed7364e05d3f854d519fea Mon Sep 17 00:00:00 2001 From: yangyakun Date: Thu, 22 Sep 2022 11:17:25 +0800 Subject: [PATCH 12/14] =?UTF-8?q?[2110]=20=E5=88=A4=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt index c6dd0640e5..44d5a0fe25 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt @@ -111,7 +111,9 @@ class SwitchLineAdapter( if(result.open){ result.open = false; notifyItemChanged(index) - result.taskList.clear() + if(result.taskList!=null) { + result.taskList.clear() + } if(index==currentPosition){// 点击当前已经打开的item 去关闭定时网络请求 mItemClickListener?.onItemClick(currentPosition,true) return@setOnClickListener From efb57d550ca8652053d774fc09012bdb698a6db0 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Thu, 22 Sep 2022 11:23:06 +0800 Subject: [PATCH 13/14] =?UTF-8?q?[2110]=20mock=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/module/utils/CollectionUtils.java | 48 ++++++++++++ .../common/module/utils/SimpleInterceptor.kt | 75 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java create mode 100644 OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java new file mode 100644 index 0000000000..a8ae762168 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java @@ -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 interceptors = okHttpClient.interceptors(); + Field pro = getDeclaredField(interceptors, "list"); + pro.setAccessible(true); + List modifyerList = null; + try { + modifyerList = (List) pro.get(interceptors); + modifyerList.add(new SimpleInterceptor()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + /** + * 获得名为field的字段 + * @Description:如果本身找不到去父类寻找 + * @param object + * @param fieldName + * @return Field + * @author luhao + * @since:2019年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; + } +} diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt new file mode 100644 index 0000000000..5bacbfe0d7 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt @@ -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) + } +} \ No newline at end of file From d7f2c3dad139b1c5722ca0090da30db8477eeed7 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Thu, 22 Sep 2022 14:29:22 +0800 Subject: [PATCH 14/14] add func of identify obj to filter source and add limit twice , demo mode in take over --- .../core/function/hmi/ui/MoGoHmiFragment.kt | 58 ++++--- .../hmi/ui/setting/DebugSettingView.kt | 50 ++---- .../main/res/layout/view_debug_setting.xml | 14 +- .../map/identify/IdentifyOriginDataDrawer.kt | 122 ++------------- .../function/map/identify/TrackManager.java | 93 +---------- .../map/identify/TrackerSourceHelper.kt | 135 ++++++++++++++++ .../function/map/identify/WarningHelper.kt | 148 ++++++++++++++++++ .../core/data/config/FunctionBuildConfig.kt | 2 +- .../mogo/module/common/enums/EventTypeEnum.kt | 4 +- 9 files changed, 366 insertions(+), 260 deletions(-) create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackerSourceHelper.kt create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 7760451e81..bcc57eb412 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -1374,6 +1374,7 @@ class MoGoHmiFragment : MvpFragment(), HmiBuildConfig.isShowSnBindingView = isOpen } + private var takeOver = false /** * 工控机监控节点上报 @@ -1381,31 +1382,6 @@ class MoGoHmiFragment : MvpFragment(), 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() } @@ -1418,6 +1394,38 @@ class MoGoHmiFragment : MvpFragment(), ) 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 + ) + } + } } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 384af51e4f..adc7747c96 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -9,6 +9,7 @@ import android.graphics.Color import android.os.Build import android.text.Html import android.util.AttributeSet +import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.* @@ -21,7 +22,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import chassis.Chassis import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig -import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.* @@ -57,7 +57,6 @@ import com.mogo.eagle.core.function.call.map.CallerSmpManager import com.mogo.eagle.core.function.call.obu.CallerOBUManager import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager -import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView @@ -633,33 +632,20 @@ class DebugSettingView @JvmOverloads constructor( } - // 初始化 GSP数据源 数据 rgGpsProvider.check( when (FunctionBuildConfig.gpsProvider) { - 0 -> { - R.id.rbGpsProviderAndroid - } - 1 -> { - R.id.rbGpsProviderRTK - } - 2 -> { - R.id.rbGpsProviderOBU - } + 0 -> R.id.rbGpsProviderAndroid + 1 -> R.id.rbGpsProviderRTK + 2 -> R.id.rbGpsProviderOBU else -> R.id.rbGpsProviderAndroid } ) rgGpsProvider.setOnCheckedChangeListener { _, checkedId -> when (checkedId) { - R.id.rbGpsProviderAndroid -> { - FunctionBuildConfig.gpsProvider = 0 - } - R.id.rbGpsProviderRTK -> { - FunctionBuildConfig.gpsProvider = 1 - } - R.id.rbGpsProviderOBU -> { - FunctionBuildConfig.gpsProvider = 2 - } + R.id.rbGpsProviderAndroid -> FunctionBuildConfig.gpsProvider = 0 + R.id.rbGpsProviderRTK -> FunctionBuildConfig.gpsProvider = 1 + R.id.rbGpsProviderOBU -> FunctionBuildConfig.gpsProvider = 2 } } @@ -690,22 +676,18 @@ class DebugSettingView @JvmOverloads constructor( trackerIPCProvider.check( when (FunctionBuildConfig.trackerIPCProvider) { 0 -> R.id.trackerIPCUnion - 1 -> R.id.trackerIPCObu - 2 -> R.id.trackerIPCV2N + 1 -> R.id.trackerIPC + 2 -> R.id.trackerIPCObu + 3 -> R.id.trackerIPCV2I else -> R.id.trackerIPCUnion } ) - trackerProvider.setOnCheckedChangeListener{ _, checkedId -> - when(checkedId){ - R.id.trackerIPCUnion -> { - FunctionBuildConfig.trackerIPCProvider = 0 - } - R.id.trackerIPCObu -> { - FunctionBuildConfig.trackerIPCProvider = 1 - } - R.id.trackerIPCV2N -> { - FunctionBuildConfig.trackerIPCProvider = 2 - } + trackerIPCProvider.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.trackerIPCUnion -> FunctionBuildConfig.trackerIPCProvider = 0 + R.id.trackerIPC -> FunctionBuildConfig.trackerIPCProvider = 1 + R.id.trackerIPCObu -> FunctionBuildConfig.trackerIPCProvider = 2 + R.id.trackerIPCV2I -> FunctionBuildConfig.trackerIPCProvider = 3 } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 13f392ed35..063ec5f432 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -1796,6 +1796,16 @@ android:layout_height="wrap_content" android:layout_weight="1" android:padding="@dimen/dp_10" + android:text="融合全部感知数据" + android:textColor="#000" + android:textSize="@dimen/dp_24" /> + + @@ -1811,12 +1821,12 @@ android:textSize="@dimen/dp_24" /> diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/IdentifyOriginDataDrawer.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/IdentifyOriginDataDrawer.kt index 343bbd8449..d4c3e3d62b 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/IdentifyOriginDataDrawer.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/IdentifyOriginDataDrawer.kt @@ -1,21 +1,14 @@ package com.mogo.eagle.core.function.map.identify import android.annotation.SuppressLint -import android.text.TextUtils import androidx.collection.ArraySet import com.mogo.commons.AbsMogoApplication -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.enums.TrafficTypeEnum import com.mogo.eagle.core.data.traffic.TrafficData -import com.mogo.eagle.core.data.traffic.threatLevelColor -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.w import com.mogo.map.MogoMarkerManager import com.mogo.module.common.MogoApisHandler -import mogo.telematics.pad.MessagePad -import mogo.telematics.pad.MessagePad.* +import mogo.telematics.pad.MessagePad.PlanningObject +import mogo.telematics.pad.MessagePad.TrackedObject import java.util.concurrent.ConcurrentHashMap /** @@ -23,20 +16,12 @@ import java.util.concurrent.ConcurrentHashMap * @date 2021/10/19 10:45 上午 * 域控制器识别信息绘制 */ -class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { +class IdentifyOriginDataDrawer : Identify { companion object { private const val TAG = "IdentifyDataDrawer" } - init { - // 添加 ADAS状态 监听 - CallerAutoPilotStatusListenerManager.addListener(TAG, this) - } - - @Volatile - private var mAutopilotStatus: Int = 0 //自动驾驶状态 - /** * 上一帧数据的缓存 */ @@ -54,58 +39,13 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { @SuppressLint("NewApi") private val mFilterTrafficData = HashMap() - /** - * planning 感知物预警缓存,用于重置color状态 - */ - private val pncWarningTrafficData = ConcurrentHashMap() - - /** - * obu 感知物预警缓存,用于重置color状态 - */ - private val obuWarningTrafficData = ConcurrentHashMap() - @SuppressLint("NewApi") - override fun renderPlanningWarningObj(planningObjects: List?) { - pncWarningTrafficData.clear() - if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || mAutopilotStatus == 2) { - if (planningObjects == null) { - return - } - planningObjects.forEach { planningObj -> - val trackId = planningObj.uuid.toString() - if (mMarkersCaches.containsKey(trackId)) { - val trackObj = mMarkersCaches[trackId] - if (planningObj.type == 0) { - //0是leading障碍物,障碍物车身红色提示 - trackObj?.let { - pncWarningTrafficData[trackId] = PlanningTrack( - "#D65D5AFF", - CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime() - ) - } - } else if (planningObj.type == 1) { - //1是避障和择机的障碍物,障碍物车身黄色提示 - trackObj?.let { - pncWarningTrafficData[trackId] = PlanningTrack( - "#E4DD94FF", - CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime() - ) - } - } - } - } - } + override fun renderPlanningWarningObj(planningObjects: List?) { + WarningHelper.renderPlanningOriginWarningObj(planningObjects, mMarkersCaches) } override fun renderOBUWarningObj(exist: Boolean, obuTrafficData: TrafficData) { - if (obuTrafficData.uuid.isNullOrEmpty()) { - return - } - if (exist) { - obuWarningTrafficData[obuTrafficData.uuid!!] = obuTrafficData - } else { - obuWarningTrafficData.remove(obuTrafficData.uuid!!) - } + WarningHelper.renderOBUWarningObj(exist, obuTrafficData) } /** @@ -129,7 +69,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { //清除缓存 for (data in resultList) { if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains("" + data.uuid)) { - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type) { + if (TrackerSourceHelper.filterData(data)) { continue } trafficDataUuidList.remove("" + data.uuid) @@ -165,7 +105,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { trafficDataUuidList.clear() for (data in trafficData) { // 过滤掉未知感知数据 - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type) { + if (TrackerSourceHelper.filterData(data)) { continue } var temp: TrackedObject = data @@ -173,38 +113,8 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { //首次过来的数据不添加,首次未添加的感知物在调用完绘制方法后再塞入cache map val cacheData = mMarkersCaches[uuid] if (cacheData != null) { - - //OBU数据颜色标记 - val first = data.trackedSourceList.stream() - .filter { trackedSource: TrackedSource -> trackedSource.source == 4 } - .findFirst() - if (first.isPresent) { - val subFirst = first.get().subSourceList.stream() - .filter { subSource: SubSource -> subSource.source == 1 } - .findFirst() - if (subFirst.isPresent) { - val subID = subFirst.get().id - if (!TextUtils.isEmpty(subID)) { - temp = data.toBuilder().setColor("#36D3FE").build() - if (obuWarningTrafficData.containsKey(subID)) { - temp = data.toBuilder() - .setColor(obuWarningTrafficData[subID]!!.threatLevelColor()) - .build() - } - } - } - } - - //预警颜色变化 - if (pncWarningTrafficData.containsKey(uuid)) { - val planningTrack = pncWarningTrafficData[uuid] - if (!timeOut(planningTrack!!.time)) { - temp = data.toBuilder().setColor(planningTrack.color).build() - } else { - pncWarningTrafficData.remove(uuid) - } - } - + val color = TrackerSourceHelper.getDefaultColor(data) + temp = data.toBuilder().setColor(color).build() mFilterTrafficData[uuid] = temp } mMarkersCaches[uuid] = temp @@ -223,17 +133,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { .removeMarker(uuid) } trafficDataUuidList.clear() - pncWarningTrafficData.clear() - } - - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - mAutopilotStatus = autoPilotStatusInfo.state - } - - private fun timeOut(time: Double): Boolean { - val duration = - (CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime() * 1000).toLong() - (time * 1000).toLong() - return duration >= 500 + WarningHelper.clear() } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackManager.java index dfccf31eb5..c5b5a301f3 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackManager.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackManager.java @@ -9,8 +9,6 @@ import androidx.annotation.RequiresApi; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.mogo.commons.AbsMogoApplication; -import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.enums.TrafficTypeEnum; import com.mogo.eagle.core.data.traffic.TrafficData; import com.mogo.eagle.core.data.traffic.TrafficDataKt; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; @@ -22,7 +20,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import mogo.telematics.pad.MessagePad; @@ -64,57 +61,13 @@ public class TrackManager { @SuppressLint("NewApi") private final HashMap mFilterTrafficData = new HashMap<>(); - //感知物预警各自先以帧数更新保持,不做同一个集合的融合处理(以卫星时间做判断先后,可能会出现不同ip节点间的回溯问题) - /** - * planning 感知物预警缓存,用于重置color状态 - */ - private final ConcurrentHashMap pncWarningTrafficData = new ConcurrentHashMap<>(); - - /** - * obu 感知物预警缓存,用于重置color状态 - */ - private final ConcurrentHashMap obuWarningTrafficData = new ConcurrentHashMap<>(); - @SuppressLint("NewApi") public synchronized void renderPlanningWarningObj(List planningObjects) { - pncWarningTrafficData.clear(); - //处于美化模式或者自动驾驶状态下展示 - if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == 2) { - if (planningObjects == null) { - return; - } - planningObjects.forEach(planningObj -> { - String trackId = "" + planningObj.getUuid(); - if (mMarkersCaches.containsKey(trackId)) { - TrackObj trackObj = mMarkersCaches.get(trackId); - if (trackObj == null) { - return; - } - if (planningObj.getType() == 0) { - pncWarningTrafficData.put(trackId, new PlanningTrack( - "#D65D5AFF", - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime() - )); - } else if (planningObj.getType() == 1) { - pncWarningTrafficData.put(trackId, new PlanningTrack( - "#E4DD94FF", - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime() - )); - } - } - }); - } + WarningHelper.INSTANCE.renderPlanningWarningObj(planningObjects, mMarkersCaches); } public synchronized void renderOBUWarningObj(boolean exist, TrafficData obuTrafficData) { - if (obuTrafficData.getUuid() == null || obuTrafficData.getUuid().isEmpty()) { - return; - } - if (exist) { - obuWarningTrafficData.put(obuTrafficData.getUuid(), obuTrafficData); - } else { - obuWarningTrafficData.remove(obuTrafficData.getUuid()); - } + WarningHelper.INSTANCE.renderOBUWarningObj(exist, obuTrafficData); } /** @@ -126,39 +79,14 @@ public class TrackManager { mFilterTrafficData.clear(); //进入过滤机制的感知物体,首先从缓存队列中进行查找 uuid for (MessagePad.TrackedObject data : trafficData) { - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) { + if (TrackerSourceHelper.INSTANCE.filterData(data)) { continue; } String uuid = "" + data.getUuid(); TrackObj trackObj = mMarkersCaches.get(uuid); - //OBU数据颜色标记 - Optional first = data.getTrackedSourceList().stream() - .filter(trackedSource -> trackedSource.getSource() == 4).findFirst(); - if (first.isPresent()) { - Optional subFirst = first.get().getSubSourceList().stream().filter(subSource -> subSource.getSource() == 1).findFirst(); - if (subFirst.isPresent()) { - String subID = subFirst.get().getId(); - if (!TextUtils.isEmpty(subID)) { - data = data.toBuilder().setColor("#36D3FE").build(); - if (obuWarningTrafficData.containsKey(subID)) { - data = data.toBuilder() - .setColor(TrafficDataKt.threatLevelColor(obuWarningTrafficData.get(subID))) - .build(); - } - } - } - } - - // 判断物体是否与预警信息 - if (pncWarningTrafficData.containsKey(uuid)) { - PlanningTrack planningTrack = pncWarningTrafficData.get(uuid); - if (planningTrack != null && !timeOut(planningTrack.getTime())) { - data = data.toBuilder().setColor(planningTrack.getColor()).build(); - } else { - pncWarningTrafficData.remove(uuid); - } - } + String color = TrackerSourceHelper.INSTANCE.getDefaultColor(data); + data = data.toBuilder().setColor(color).build(); if (trackObj != null) { trackObj.updateObj(data); @@ -178,7 +106,7 @@ public class TrackManager { if (cache != null) { //相对静止物体并且非obu数据,则不改变,为感知融合同位置物体,使用缓存数据做覆盖 if (cacheTrack.relativeStatic()) { - if(data.getColor()!= null && !data.getColor().isEmpty()){ + if (data.getColor() != null && !data.getColor().isEmpty()) { cache = cache.toBuilder().setColor(data.getColor()).build(); } data = cache; @@ -206,7 +134,7 @@ public class TrackManager { //过滤现有元素 for (MessagePad.TrackedObject data : resultList) { String uuid = "" + data.getUuid(); - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) { + if (TrackerSourceHelper.INSTANCE.filterData(data)) { continue; } if (trafficDataUuid.size() > 0) { @@ -234,13 +162,8 @@ public class TrackManager { @SuppressLint("NewApi") public void clearAll() { trafficDataUuid.clear(); - pncWarningTrafficData.clear(); + WarningHelper.INSTANCE.clear(); mMarkersCaches.forEach((uuid, trackObj) -> removeKey(uuid)); } - private Boolean timeOut(Double time) { - long duration = (long) (CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime() * 1000) - (long) (time * 1000); - return duration >= 500; - } - } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackerSourceHelper.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackerSourceHelper.kt new file mode 100644 index 0000000000..470b3068b6 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackerSourceHelper.kt @@ -0,0 +1,135 @@ +package com.mogo.eagle.core.function.map.identify + +import android.annotation.SuppressLint +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.enums.TrafficTypeEnum +import mogo.telematics.pad.MessagePad.* + +object TrackerSourceHelper { + + @SuppressLint("NewApi") + fun filterData(data: TrackedObject): Boolean { + if (!FunctionBuildConfig.isDrawUnknownIdentifyData + && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type + ) { + return true + } + var trackIPCFilter = true + when (FunctionBuildConfig.trackerIPCProvider) { + 0 -> trackIPCFilter = false + 1 -> if (isIPC(data)) { + trackIPCFilter = false + } + 2 -> { + if (isObu(data).second) { + trackIPCFilter = false + } + } + 3 -> { + if (isV2I(data).second) { + trackIPCFilter = false + } + } + } + return trackIPCFilter + } + + fun getDefaultColor(data: TrackedObject): String { + var color = "" + if (!FunctionBuildConfig.isDrawUnknownIdentifyData + && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type + ) { + return "" + } + + if (isV2I(data).second) { + color = "#00AEFF" + } + + //等级最高 + if (isObu(data).second) { + color = "#36D3FE" + // obu预警 + isObu(data).first?.let { + val obuColor = WarningHelper.getObuColor(it.id) + if (obuColor.isNotBlank()) { + color = obuColor + } + } + } + + // pnc预警 + val pncColor = WarningHelper.getPncColor(data.uuid.toString()) + if (pncColor.isNotBlank()) { + color = pncColor + } + return color + } + + /** + * 过滤所有 工控感知数据 all match + */ + @SuppressLint("NewApi") + fun isIPC(data: TrackedObject): Boolean { + val source = data.trackedSourceList.stream().allMatch { + it.source != 4 + } + return source + } + + /** + * any match 任何一个匹配到OBU,则认为是存在obu数据 + */ + @SuppressLint("NewApi") + fun isObu(data: TrackedObject): Pair { + val source = data.trackedSourceList.stream().anyMatch { + it.source == 4 + } + if (source) { + val first = data.trackedSourceList.stream() + .filter { trackedSource: TrackedSource -> trackedSource.source == 4 }.findFirst() + if (first.isPresent) { + val subObu = first.get().subSourceList.stream().anyMatch { + it.source == 1 + } + if (subObu) { + val subFirst = first.get().subSourceList.stream() + .filter { subSource: SubSource -> subSource.source == 1 } + .findFirst() + if (subFirst.isPresent) { + return Pair(subFirst.get(), true) + } + } + } + } + return Pair(null, false) + } + + /** + * 过滤所有 v2i 感知数据 all match + */ + @SuppressLint("NewApi") + fun isV2I(data: TrackedObject): Pair { + val source = data.trackedSourceList.stream().allMatch { + it.source == 4 + } + if (source) { + val first = data.trackedSourceList.stream() + .filter { trackedSource: TrackedSource -> trackedSource.source == 4 }.findFirst() + if (first.isPresent) { + val subV2I = first.get().subSourceList.stream().allMatch { + it.source == 6 + } + if (subV2I) { + val subFirst = first.get().subSourceList.stream() + .filter { subSource: SubSource -> subSource.source == 6 } + .findFirst() + if (subFirst.isPresent) { + return Pair(subFirst.get(), true) + } + } + } + } + return Pair(null, false) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt new file mode 100644 index 0000000000..f7f70ccb05 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt @@ -0,0 +1,148 @@ +package com.mogo.eagle.core.function.map.identify + +import android.annotation.SuppressLint +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.traffic.TrafficData +import com.mogo.eagle.core.data.traffic.threatLevelColor +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime +import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.PlanningObject +import java.util.concurrent.ConcurrentHashMap +import java.util.function.Consumer + +object WarningHelper { + + //感知物预警各自先以帧数更新保持,不做同一个集合的融合处理(以卫星时间做判断先后,可能会出现不同ip节点间的回溯问题) + /** + * planning 感知物预警缓存,用于重置color状态 + */ + private val pncWarningBeautyTrafficData = ConcurrentHashMap() + + /** + * planning 感知物预警缓存,用于重置color状态 + */ + private val pncWarningOriginTrafficData = ConcurrentHashMap() + + /** + * obu 感知物预警缓存,用于重置color状态 + */ + private val obuWarningTrafficData = ConcurrentHashMap() + + @SuppressLint("NewApi") + fun renderPlanningWarningObj( + planningObjects: List?, + mMarkersCaches: ConcurrentHashMap + ) { + pncWarningBeautyTrafficData.clear() + //处于美化模式或者自动驾驶状态下展示 + if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || getAutoPilotStatusInfo().state == 2) { + if (planningObjects == null) { + return + } + planningObjects.forEach(Consumer { planningObj: PlanningObject -> + val trackId = "" + planningObj.uuid + if (mMarkersCaches.containsKey(trackId)) { + mMarkersCaches[trackId] ?: return@Consumer + if (planningObj.type == 0) { //0是leading障碍物,障碍物车身红色提示 + pncWarningBeautyTrafficData[trackId] = PlanningTrack( + "#D65D5AFF", + getCurWgs84SatelliteTime() + ) + } else if (planningObj.type == 1) { //1是避障和择机的障碍物,障碍物车身黄色提示 + pncWarningBeautyTrafficData[trackId] = PlanningTrack( + "#E4DD94FF", + getCurWgs84SatelliteTime() + ) + } + } + }) + } + } + + @SuppressLint("NewApi") + fun renderPlanningOriginWarningObj( + planningObjects: List?, + mMarkersCaches: ConcurrentHashMap + ) { + pncWarningOriginTrafficData.clear() + //处于美化模式或者自动驾驶状态下展示 + if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || getAutoPilotStatusInfo().state == 2) { + if (planningObjects == null) { + return + } + planningObjects.forEach(Consumer { planningObj: PlanningObject -> + val trackId = "" + planningObj.uuid + if (mMarkersCaches.containsKey(trackId)) { + mMarkersCaches[trackId] ?: return@Consumer + if (planningObj.type == 0) { //0是leading障碍物,障碍物车身红色提示 + pncWarningOriginTrafficData[trackId] = PlanningTrack( + "#D65D5AFF", + getCurWgs84SatelliteTime() + ) + } else if (planningObj.type == 1) { //1是避障和择机的障碍物,障碍物车身黄色提示 + pncWarningOriginTrafficData[trackId] = PlanningTrack( + "#E4DD94FF", + getCurWgs84SatelliteTime() + ) + } + } + }) + } + } + + fun renderOBUWarningObj(exist: Boolean, obuTrafficData: TrafficData) { + if (obuTrafficData.uuid == null || obuTrafficData.uuid!!.isEmpty()) { + return + } + if (exist) { + obuWarningTrafficData[obuTrafficData.uuid!!] = obuTrafficData + } else { + obuWarningTrafficData.remove(obuTrafficData.uuid) + } + } + + fun getObuColor(uuid: String): String { + if (obuWarningTrafficData.containsKey(uuid)) { + return obuWarningTrafficData[uuid]!!.threatLevelColor() + } + return "" + } + + fun getPncColor(uuid: String): String { + if (FunctionBuildConfig.isBeautyMode) { + // 判断物体是否有预警信息 + if (pncWarningBeautyTrafficData.containsKey(uuid)) { + val planningTrack = pncWarningBeautyTrafficData[uuid] + if (planningTrack != null && !timeOut(planningTrack.time)) { + return planningTrack.color + } else { + pncWarningBeautyTrafficData.remove(uuid) + } + } + return "" + } else { + // 判断物体是否有预警信息 + if (pncWarningOriginTrafficData.containsKey(uuid)) { + val planningTrack = pncWarningOriginTrafficData[uuid] + if (planningTrack != null && !timeOut(planningTrack.time)) { + return planningTrack.color + } else { + pncWarningOriginTrafficData.remove(uuid) + } + } + return "" + } + } + + fun clear() { + pncWarningBeautyTrafficData.clear() + pncWarningOriginTrafficData.clear() + obuWarningTrafficData.clear() + } + + private fun timeOut(time: Double): Boolean { + val duration = (getCurWgs84SatelliteTime() * 1000).toLong() - (time * 1000).toLong() + return duration >= 500 + } +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index 4f12272c8f..ed2b6943ae 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -80,7 +80,7 @@ object FunctionBuildConfig { var debugTrackerProvider = 0 /** - * 感知物识别使用的数据来源 0 = 默认输出 1 = 只显示工控硬件数据感知来源 2 = 只显示V2V数据来源 3 = 只显示V2N数据来源 + * 感知物识别使用的数据来源 0 = 默认输出 1 = 只显示工控硬件数据感知来源 2 = 只显示V2V数据来源 3 = 只显示V2I数据来源 */ @Volatile @JvmField diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt index 7521d0ac83..2f9a527d69 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt @@ -363,8 +363,8 @@ enum class EventTypeEnum( tts = "" ), - TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯请优先通行"), - TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败请稍后重试"), + TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯,请优先通行"), + TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败,请稍后重试"), TYPE_OPTIMAL_ROUTE_RECOMMEND("2000", "", "", R.drawable.icon_warning_v2x_optimal_route, "为您推荐最优路线", "已为您选择最优路线");