diff --git a/.gitignore b/.gitignore index 3ec053d928..f11e27d274 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ /build /captures .externalNativeBuild -.cxx \ No newline at end of file +.cxx +.gitlab-ci.yml \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index c4416b34c7..0000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,27 +0,0 @@ -stages: - - analyze - -inspect java and kotlin codes: - tags: - - apk - - android - stage: analyze - script: - - echo "$CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA $CI_COMMIT_BRANCH $CI_COMMIT_DESCRIPTION $CI_COMMIT_TIMESTAMP" - - echo "${CI_JOB_STAGE}_reports_${CI_PROJECT_NAME}_${CI_BUILD_REF_NAME}" - - ./gradlew runCodeInspect - before_script: - - source change_java_version - artifacts: - name: "${CI_JOB_STAGE}_reports_${CI_PROJECT_NAME}_$CI_COMMIT_REF_SLUG" - when: always - expire_in: 1 days - paths: - - "build/reports/*" - only: - - $CI_COMMIT_BRANCH - - pushes - - schedules - except: - - master - allow_failure: true diff --git a/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java b/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java index 0c12f4cad9..84d8af86be 100644 --- a/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java @@ -7,7 +7,6 @@ import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_STOPPED; import android.content.Context; import android.os.Handler; -import android.os.Message; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -81,7 +80,6 @@ import java.util.ArrayList; import java.util.List; import io.reactivex.exceptions.UndeliverableException; -import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; import mogo.telematics.pad.MessagePad; @@ -98,6 +96,7 @@ public class OrderModel { private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引 private static volatile OrderModel sInstance; + private static final byte[] obj = new byte[0]; private Context mContext; private final List stationList = new ArrayList<>(); private BusRoutesResult busRoutesResult = null; @@ -125,20 +124,20 @@ public class OrderModel { private LoginService loginService; - private final Handler handler = new Handler(new Handler.Callback() { - @Override - public boolean handleMessage(Message msg) { - if (msg.what == MSG_QUERY_BUS_STATION) { - queryBusRoutes(); - return true; - } - return false; + private final Handler handler = new Handler(msg -> { + if (msg.what == MSG_QUERY_BUS_STATION) { + queryBusRoutes(); + return true; } + return false; }); + private OrderModel() { + } + public static OrderModel getInstance() { if (sInstance == null) { - synchronized (OrderModel.class) { + synchronized (obj) { if (sInstance == null) { sInstance = new OrderModel(); } @@ -147,10 +146,6 @@ public class OrderModel { return sInstance; } - private OrderModel() { - - } - public void init() { mContext = AbsMogoApplication.getApp(); loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); @@ -171,7 +166,7 @@ public class OrderModel { OCHSocketMessageManager.INSTANCE.registerSocketMessageListener(//监听核销乘客 OCHSocketMessageManager.msgWriteOffPassengerType, - mWriteOffPassengeOnMessageListener); + mWriteOffPassengerOnMessageListener); AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext); @@ -180,38 +175,35 @@ public class OrderModel { //2022.1.28 // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 // The exception could not be delivered to the consumer because it has already canceled/disposed - // the flow or the excTeption has nowhere to go to begin with - RxJavaPlugins.setErrorHandler(new Consumer() { - @Override - public void accept(Throwable e) { - if (e instanceof UndeliverableException) { - e = e.getCause(); - CallerLogger.d(M_BUS + TAG, "UndeliverableException"); - } - if ((e instanceof IOException)) {// - // fine, irrelevant network problem or API that throws on cancellation - CallerLogger.d(M_BUS + TAG, "IOException"); - return; - } - if (e instanceof InterruptedException) { - // fine, some blocking code was interrupted by a dispose call - CallerLogger.d(M_BUS + TAG, "InterruptedException"); - return; - } - if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { - // that's likely a bug in the application - CallerLogger.d(M_BUS + TAG, "NullPointerException or IllegalArgumentException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - if (e instanceof IllegalStateException) { - // that's a bug in RxJava or in a custom operator - CallerLogger.d(M_BUS + TAG, "IllegalStateException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - CallerLogger.d(M_BUS + TAG, "Undeliverable exception"); + // the flow or the exception has nowhere to go to begin with + RxJavaPlugins.setErrorHandler(e -> { + if (e instanceof UndeliverableException) { + e = e.getCause(); + CallerLogger.d(M_BUS + TAG, "UndeliverableException"); } + if ((e instanceof IOException)) { + // fine, irrelevant network problem or API that throws on cancellation + CallerLogger.d(M_BUS + TAG, "IOException"); + return; + } + if (e instanceof InterruptedException) { + // fine, some blocking code was interrupted by a dispose call + CallerLogger.d(M_BUS + TAG, "InterruptedException"); + return; + } + if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { + // that's likely a bug in the application + CallerLogger.d(M_BUS + TAG, "NullPointerException or IllegalArgumentException"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + if (e instanceof IllegalStateException) { + // that's a bug in RxJava or in a custom operator + CallerLogger.d(M_BUS + TAG, "IllegalStateException"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + CallerLogger.d(M_BUS + TAG, "Undeliverable exception"); }); } @@ -234,7 +226,7 @@ public class OrderModel { } }; - private final IMogoOnMessageListener mWriteOffPassengeOnMessageListener = + private final IMogoOnMessageListener mWriteOffPassengerOnMessageListener = new IMogoOnMessageListener() { @Override public Class target() { @@ -272,11 +264,8 @@ public class OrderModel { this.mControllerStatusCallback = callback; } - private final ITrajectoryListener trajectoryListener = new ITrajectoryListener() { - @Override - public void trajectoryCallback(@NonNull List routeArrivied, @NonNull List routeArriving, @NonNull MogoLocation location) { + private final ITrajectoryListener trajectoryListener = (routeArrivied, routeArriving, location) -> { - } }; private final IMoGoPlanningRottingListener moGoAutopilotPlanningListener = new IMoGoPlanningRottingListener() { @@ -361,11 +350,6 @@ public class OrderModel { TrajectoryAndDistanceManager.INSTANCE.removeListener(TAG); } - private Object readResolve() { - // 阻止反序列化,必须实现 Serializable 接口 - return sInstance; - } - private final IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() { // VR mode变更回调 @Override @@ -444,8 +428,6 @@ public class OrderModel { CallerLogger.d(M_BUS + TAG, "judgeArrivedStation() = 刚过站且在15m内"); onArriveAt(null); //无自动驾驶到站信息传null } - - return; } } @@ -621,10 +603,7 @@ public class OrderModel { leaveTTSTips(nextStation,nextStationKr); if (busRoutesResult != null) { - boolean isLastStop = false; - if (leaveIndex + 1 == stationList.size() - 1) { - isLastStop = true; - } + boolean isLastStop = leaveIndex + 1 == stationList.size() - 1; //给bus外屏发送 BusSendTripInfoManager.INSTANCE.sendBusTripInfo(BusSendTripInfoManager.LEAVE_STATION , busRoutesResult.getName() @@ -768,10 +747,7 @@ public class OrderModel { private void arriveStationSuccess(int arrivedStationIndex, String departureStopName, String arriveStation, String arriveStationKr) { if (busRoutesResult != null) { - boolean isLastStop = false; - if (arrivedStationIndex == busRoutesResult.getSites().size() - 1) { - isLastStop = true; - } + boolean isLastStop = arrivedStationIndex == busRoutesResult.getSites().size() - 1; //给bus外屏发送 BusSendTripInfoManager.INSTANCE.sendBusTripInfo(BusSendTripInfoManager.ARRIVE_STATION , busRoutesResult.getName() @@ -845,12 +821,7 @@ public class OrderModel { //车站10s后播报 private void leaveTTSTips(String nextStation,String nextStationKr) { - UiThreadHandler.postDelayed(new Runnable() { - @Override - public void run() { - VoiceManager.INSTANCE.leaveStationBus(nextStation,nextStationKr); - } - },DELAY_10S); + UiThreadHandler.postDelayed(() -> VoiceManager.INSTANCE.leaveStationBus(nextStation,nextStationKr),DELAY_10S); } /** @@ -981,16 +952,12 @@ public class OrderModel { } } - Runnable tip3Runnable = new Runnable() { - @Override - public void run() { - - if (backgroundCurrentStationIndex == 0 && stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED - && !stationList.get(0).isLeaving()){ - tipStartTask("3"); - }else { - removeTipRunnables(); - } + Runnable tip3Runnable = () -> { + if (backgroundCurrentStationIndex == 0 && stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED + && !stationList.get(0).isLeaving()){ + tipStartTask("3"); + }else { + removeTipRunnables(); } }; @@ -1005,16 +972,11 @@ public class OrderModel { VoiceNotice.showNotice(tips); } - Runnable tip1Runnable = new Runnable() { - @Override - public void run() { - if (backgroundCurrentStationIndex == 0 && stationList != null && - stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED - && !stationList.get(0).isLeaving()){ - tipStartTask("1"); - }else { - removeTipRunnables(); - } + Runnable tip1Runnable = () -> { + if (backgroundCurrentStationIndex == 0 && stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED && !stationList.get(0).isLeaving()){ + tipStartTask("1"); + }else { + removeTipRunnables(); } }; @@ -1205,7 +1167,7 @@ public class OrderModel { } public void triggerStartServiceEvent(boolean isRestart, boolean send) { - if (stationList == null || backgroundCurrentStationIndex >= stationList.size() - 1) { + if (backgroundCurrentStationIndex >= stationList.size() - 1) { return; } BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex); @@ -1215,7 +1177,7 @@ public class OrderModel { } public void triggerUnableStartAPReasonEvent() { - if (stationList == null || backgroundCurrentStationIndex >= stationList.size() - 1) { + if (backgroundCurrentStationIndex >= stationList.size() - 1) { return; } BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex); @@ -1253,8 +1215,8 @@ public class OrderModel { } private AutopilotControlParameters initAutopilotControlParameters(int leaveIndex) { - BusStationBean currentStation = null; - BusStationBean nextStation = null; + BusStationBean currentStation; + BusStationBean nextStation; if (leaveIndex < 0) { if (backgroundCurrentStationIndex + 1 > stationList.size() - 1 || !isGoingToNextStation) { diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java index 4b652d30df..66b7189524 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java @@ -46,7 +46,7 @@ public class BusRoutesResult { return sites; } - public void setSite(List site) { + public void setSites(List sites) { this.sites = sites; } diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index 43eebbf35c..bedb5d6436 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -22,7 +22,6 @@ import androidx.constraintlayout.widget.Group; import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener; 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.autopilot.CallerAutopilotRecordListenerManager; @@ -60,7 +59,7 @@ import record_cache.RecordPanelOuterClass; * * @author tongchenfei */ -public abstract class BaseBusTabFragment> extends MvpFragment implements IMogoMapListener, IMoGoAutopilotRecordListener { +public abstract class BaseBusTabFragment> extends MvpFragment implements IMogoMapListener { private static final String TAG = "BaseBusTabFragment"; @@ -206,7 +205,6 @@ public abstract class BaseBusTabFragment if (mBadcaseBtn != null) { CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn); - CallerAutopilotRecordListenerManager.INSTANCE.addListener(TAG, this); } //消息盒子 @@ -299,18 +297,6 @@ public abstract class BaseBusTabFragment EventBus.getDefault().unregister(this); } - @Override - public void onAutopilotRecordResult(@Nullable RecordPanelOuterClass.RecordPanel recordPanel) { - } - - @Override - public void onAutopilotRecordConfig(@NonNull MessagePad.RecordDataConfig config) { - } - - @Override - public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) { - } - /** * 测试到站 */ diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/BusLineModel.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/BusLineModel.java index b116e97940..9ab9e562f7 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/BusLineModel.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/BusLineModel.java @@ -1,7 +1,6 @@ package com.mogo.och.bus.model; import android.content.Context; -import android.util.Log; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.utilcode.util.NetworkUtils; @@ -24,9 +23,13 @@ public class BusLineModel { private static volatile BusLineModel sInstance; private Context mContext; private IBusLinesCallback mBusLinesCallback; + private static final byte[] obj = new byte[0]; + + private BusLineModel() { + } public static BusLineModel getInstance() { if ( sInstance == null ) { - synchronized ( BusLineModel.class ) { + synchronized ( obj ) { if ( sInstance == null ) { sInstance = new BusLineModel(); } @@ -34,9 +37,7 @@ public class BusLineModel { } return sInstance; } - private BusLineModel() { - } public void init() { mContext = AbsMogoApplication.getApp(); } @@ -79,7 +80,7 @@ public class BusLineModel { /** * 通过线路id 查询线路排班表 - * @param lineId + * @param lineId 线路id * @param position 位置 */ public void queryBusLineTasksById(int lineId, int position,boolean autoRefresh){ diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java index 1571739e3b..15ff420cc1 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java @@ -11,7 +11,6 @@ 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; @@ -28,19 +27,19 @@ public class OpenItemAnimator extends DefaultItemAnimator { private static TimeInterpolator sDefaultInterpolator; - private ArrayList mPendingRemovals = new ArrayList<>(); - private ArrayList mPendingAdditions = new ArrayList<>(); - private ArrayList mPendingMoves = new ArrayList<>(); - private ArrayList mPendingChanges = new ArrayList<>(); + private final ArrayList mPendingRemovals = new ArrayList<>(); + private final ArrayList mPendingAdditions = new ArrayList<>(); + private final ArrayList mPendingMoves = new ArrayList<>(); + private final ArrayList mPendingChanges = new ArrayList<>(); - ArrayList> mAdditionsList = new ArrayList<>(); - ArrayList> mMovesList = new ArrayList<>(); - ArrayList> mChangesList = new ArrayList<>(); + private final ArrayList> mAdditionsList = new ArrayList<>(); + private final ArrayList> mMovesList = new ArrayList<>(); + private final ArrayList> mChangesList = new ArrayList<>(); - ArrayList mAddAnimations = new ArrayList<>(); - ArrayList mMoveAnimations = new ArrayList<>(); - ArrayList mRemoveAnimations = new ArrayList<>(); - ArrayList mChangeAnimations = new ArrayList<>(); + private final ArrayList mAddAnimations = new ArrayList<>(); + private final ArrayList mMoveAnimations = new ArrayList<>(); + private final ArrayList mRemoveAnimations = new ArrayList<>(); + private final ArrayList mChangeAnimations = new ArrayList<>(); private static class MoveInfo { public RecyclerView.ViewHolder holder; @@ -102,20 +101,16 @@ public class OpenItemAnimator extends DefaultItemAnimator { mPendingRemovals.clear(); // Next, move stuff if (movesPending) { - final ArrayList moves = new ArrayList<>(); - moves.addAll(mPendingMoves); + final ArrayList moves = new ArrayList<>(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); + Runnable mover = () -> { + for (MoveInfo moveInfo : moves) { + animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY, + moveInfo.toX, moveInfo.toY); } + moves.clear(); + mMovesList.remove(moves); }; if (removalsPending) { View view = moves.get(0).holder.itemView; @@ -126,19 +121,15 @@ public class OpenItemAnimator extends DefaultItemAnimator { } // Next, change stuff, to run in parallel with move animations if (changesPending) { - final ArrayList changes = new ArrayList<>(); - changes.addAll(mPendingChanges); + final ArrayList changes = new ArrayList<>(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); + Runnable changer = () -> { + for (ChangeInfo change : changes) { + animateChangeImpl(change); } + changes.clear(); + mChangesList.remove(changes); }; if (removalsPending) { RecyclerView.ViewHolder holder = changes.get(0).oldHolder; @@ -149,19 +140,15 @@ public class OpenItemAnimator extends DefaultItemAnimator { } // Next, add stuff if (additionsPending) { - final ArrayList additions = new ArrayList<>(); - additions.addAll(mPendingAdditions); + final ArrayList additions = new ArrayList<>(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); + Runnable adder = () -> { + for (RecyclerView.ViewHolder holder : additions) { + animateAddImpl(holder); } + additions.clear(); + mAdditionsList.remove(additions); }; if (removalsPending || movesPending || changesPending) { long removeDuration = removalsPending ? getRemoveDuration() : 0; @@ -341,8 +328,8 @@ public class OpenItemAnimator extends DefaultItemAnimator { final ViewPropertyAnimator oldViewAnim = view.animate().setDuration( getChangeDuration()); mChangeAnimations.add(changeInfo.oldHolder); - oldViewAnim.translationX(changeInfo.toX - changeInfo.fromX); - oldViewAnim.translationY(changeInfo.toY - changeInfo.fromY); + oldViewAnim.translationX((float) (changeInfo.toX - changeInfo.fromX)); + oldViewAnim.translationY((float) (changeInfo.toY - changeInfo.fromY)); oldViewAnim.alpha(0).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animator) { @@ -480,25 +467,25 @@ public class OpenItemAnimator extends DefaultItemAnimator { } // animations should be ended by the cancel above. - //noinspection PointlessBooleanExpression,ConstantConditions + //noinspection Pointless BooleanExpression,ConstantConditions if (mRemoveAnimations.remove(item) && DEBUG) { throw new IllegalStateException("after animation is cancelled, item should not be in " + "mRemoveAnimations list"); } - //noinspection PointlessBooleanExpression,ConstantConditions + //noinspection Pointless BooleanExpression,ConstantConditions if (mAddAnimations.remove(item) && DEBUG) { throw new IllegalStateException("after animation is cancelled, item should not be in " + "mAddAnimations list"); } - //noinspection PointlessBooleanExpression,ConstantConditions + //noinspection Pointless BooleanExpression,ConstantConditions if (mChangeAnimations.remove(item) && DEBUG) { throw new IllegalStateException("after animation is cancelled, item should not be in " + "mChangeAnimations list"); } - //noinspection PointlessBooleanExpression,ConstantConditions + //noinspection Pointless BooleanExpression,ConstantConditions if (mMoveAnimations.remove(item) && DEBUG) { throw new IllegalStateException("after animation is cancelled, item should not be in " + "mMoveAnimations list"); diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/BusArcView.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/BusArcView.java index a9e7bdff5d..29525b0169 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/BusArcView.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/BusArcView.java @@ -24,13 +24,13 @@ import com.mogo.och.bus.R; public class BusArcView extends View { //中心的文字描述 - private String mDes = "KM/H"; + private final String mDes = "KM/H"; //根据数据显示的圆弧Paint private Paint mArcPaint; //圆弧颜色 private int mArcColor; //圆弧的画笔的宽度 - private float mStrokeWith = getResources().getDimension(R.dimen.bus_ext_arcView_stroke_with); + private final float mStrokeWith = getResources().getDimension(R.dimen.bus_ext_arcView_stroke_with); //文字描述的paint private Paint mTextPaint; @@ -39,9 +39,9 @@ public class BusArcView extends View { //当前数据 private int currentValue; //最大数据 - private int maxValue = 240; + private final int maxValue = 240; //圆弧背景的开始和结束间的夹角大小 - private float mAngle = 270; + private final float mAngle = 270; //上次绘制圆弧夹角 private float lastAngle = 0; @@ -75,13 +75,13 @@ public class BusArcView extends View { mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); //绘制中心的数值 mTextPaint.getTextBounds(mValue, 0, mValue.length(), mRect); - canvas.drawText(mValue, getWidth() / 2, getHeight() / 2 + mRect.height() / 2 - 10, mTextPaint); + canvas.drawText(mValue, getWidth() / 2.0f, getHeight() / 2.0f + mRect.height() / 2.0f - 10, mTextPaint); mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); //绘制中心文字描述 mTextPaint.setTextSize(getResources().getDimension(R.dimen.bus_ext_arcView_des_text_size)); mTextPaint.getTextBounds(mDes, 0, mDes.length(), mRect); - canvas.drawText(mDes, getWidth() / 2, getHeight() * 17 / 20 + mRect.height() / 2, mTextPaint); + canvas.drawText(mDes, getWidth() / 2.0f, getHeight() * 17.0f / 20.0f + mRect.height() / 2.0f, mTextPaint); } private void drawArc(Canvas canvas) { @@ -135,13 +135,10 @@ public class BusArcView extends View { ValueAnimator progressAnimator = ValueAnimator.ofFloat(startAngle, currentAngle); progressAnimator.setDuration(time); progressAnimator.setTarget(mIncludedAngle); - progressAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - mIncludedAngle = (float) animation.getAnimatedValue(); - //重新绘制,不然不会出现效果 - postInvalidate(); - } + progressAnimator.addUpdateListener(animation -> { + mIncludedAngle = (float) animation.getAnimatedValue(); + //重新绘制,不然不会出现效果 + postInvalidate(); }); //开始执行动画 progressAnimator.start(); diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java index e010f37a76..7219b7b20d 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java @@ -22,7 +22,6 @@ import android.view.animation.DecelerateInterpolator; import androidx.annotation.Nullable; import com.mogo.commons.AbsMogoApplication; -import com.mogo.eagle.core.utilcode.util.BitmapHelper; import com.mogo.och.bus.R; import me.jessyan.autosize.AutoSizeConfig; @@ -93,7 +92,7 @@ public class SlidePanelView extends View { private ObjectAnimator matrixAnim; private String blockText = STRING_SLIDE_TO_RIGHT; - private Paint.FontMetrics blockTextMetrics = new Paint.FontMetrics(); + private final Paint.FontMetrics blockTextMetrics = new Paint.FontMetrics(); private static final int GRADIENT_OFFSET = 200; @@ -250,7 +249,7 @@ public class SlidePanelView extends View { private void startBlockBackAnim() { ObjectAnimator blockBackanimator = ObjectAnimator.ofInt(this, "blockOffset", blockOffset, 0); blockBackanimator.setInterpolator(new DecelerateInterpolator()); - blockBackanimator.setDuration(1000 * blockOffset / getWidth()); + blockBackanimator.setDuration(1000L * blockOffset / getWidth()); blockBackanimator.start(); lastX = 0; } @@ -259,15 +258,15 @@ public class SlidePanelView extends View { protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 画背景 - canvas.drawRoundRect(bgRectF, (float) getHeight() / 2, (float) getHeight() / 2, bgPaint); + canvas.drawRoundRect(bgRectF, (float) getHeight() / 2.0f, (float) getHeight() / 2.0f, bgPaint); // 画文字 gradientMatrix.setTranslate(matrixTranslate, 0); textGradient.setLocalMatrix(gradientMatrix); canvas.save(); - canvas.drawText(blockText, blockWidth + BLOCK_START_X + textMarginLeft, textOffset, textPaint); + canvas.drawText(blockText, (float) (blockWidth + BLOCK_START_X + textMarginLeft), textOffset, textPaint); canvas.restore(); // 画滑块 - canvas.drawBitmap(bmBlock, BLOCK_START_X + blockOffset, BLOCK_START_Y, blockPaint); + canvas.drawBitmap(bmBlock, (float) (BLOCK_START_X + blockOffset), (float) BLOCK_START_Y, blockPaint); } public interface OnSlidePanelMoveToEndListener { diff --git a/OCH/bus/passenger/build.gradle b/OCH/bus/passenger/build.gradle index 6732195e81..391d65936f 100644 --- a/OCH/bus/passenger/build.gradle +++ b/OCH/bus/passenger/build.gradle @@ -68,8 +68,9 @@ dependencies { implementation project(":OCH:mogo-och-common-module") compileOnly project(":libraries:mogo-map") implementation project(':core:mogo-core-res') - testImplementation 'junit:junit:4.12' + androidTestImplementation rootProject.ext.dependencies.androidxjunit + testImplementation rootProject.ext.dependencies.junit } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() \ No newline at end of file diff --git a/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java b/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java index 5d1778ca79..cf1643aa61 100644 --- a/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java +++ b/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java @@ -47,7 +47,7 @@ public class MogoOCHBusPassenger implements IMogoOCH { this.mContainerId = containerId; showFragment(); - if (AppIdentityModeUtils.isJL(FunctionBuildConfig.appIdentityMode)) { + if (AppIdentityModeUtils.isJL(FunctionBuildConfig.appIdentityMode) && activity != null) { MultiDisplayUtils.INSTANCE.startActWithSecond(activity, VideoPlayerActivity.class); } diff --git a/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt b/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt index f3a411dbe5..2dc3afbc48 100644 --- a/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt +++ b/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt @@ -517,14 +517,10 @@ object BusPassengerModel { } // if (DebugConfig.isDebug()) { - // ToastUtils.showShort("到达目的地"); + // ToastUtils.showShort("到达目的地") // } mADASStatusCallback?.onAutopilotArriveEnd() } - - override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {} - - override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) {} } private val moGoAutopilotPlanningListener: IMoGoPlanningRottingListener = object : IMoGoPlanningRottingListener { diff --git a/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java b/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java index edab28cb78..3cad825966 100644 --- a/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java +++ b/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java @@ -19,7 +19,10 @@ public class BusPassengerMapAssetStyleUtil { is1 = context.getResources().getAssets().open(fileName); //eg. over_view_style.data int lenght1 = is1.available(); buffer1 = new byte[lenght1]; - is1.read(buffer1); + int count = 0; + while ((count = is1.read(buffer1)) > 0) { + is1.read(buffer1); + } } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/OCH/bus/passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java b/OCH/bus/passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java index d940b2948f..dd13881f86 100644 --- a/OCH/bus/passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java +++ b/OCH/bus/passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java @@ -8,7 +8,7 @@ import org.junit.Test; * @see Testing documentation */ public class ExampleUnitTest { - @Test + //@Test public void addition_isCorrect() { } diff --git a/OCH/charter/driver/build.gradle b/OCH/charter/driver/build.gradle index 92631f28d4..f28ba4dcbd 100644 --- a/OCH/charter/driver/build.gradle +++ b/OCH/charter/driver/build.gradle @@ -64,7 +64,8 @@ dependencies { implementation project(":OCH:mogo-och-common-module") compileOnly project(":libraries:mogo-map") - testImplementation 'junit:junit:4.12' + androidTestImplementation rootProject.ext.dependencies.androidxjunit + testImplementation rootProject.ext.dependencies.junit } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() \ No newline at end of file diff --git a/OCH/charter/driver/src/main/AndroidManifest.xml b/OCH/charter/driver/src/main/AndroidManifest.xml index f9cccd9894..46a1d0cace 100644 --- a/OCH/charter/driver/src/main/AndroidManifest.xml +++ b/OCH/charter/driver/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - + \ No newline at end of file diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt index 04355d8e1d..51c1dd5405 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt @@ -12,6 +12,7 @@ import androidx.constraintlayout.widget.Group import com.magic.mogo.och.charter.R import com.magic.mogo.och.charter.constant.CharterConst import com.magic.mogo.och.charter.view.SlidePanelView +import com.magic.mogo.och.charter.view.autopilot.AutopilotStatusView import com.mogo.commons.mvp.IView import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.mvp.Presenter @@ -54,16 +55,13 @@ abstract class CharterBaseFragment?>() : private val TAG = "BaseBusTabFragment" - private var ctvAutopilotStatus: RelativeLayout? = null - private var ctvAutopilotStatusIv: ImageView? = null - private var ctvAutopilotStatusTv: TextView? = null + private var ctvAutopilotStatus: AutopilotStatusView? = null protected var mSettingBtn: RelativeLayout? = null protected var mBadcaseBtn: RelativeLayout? = null protected var mAICollectBtn: RelativeLayout? = null private var flStationPanelContainer: FrameLayout? = null private var mapBizView: MapBizView? = null private var groupTestPanel: Group? = null - private var mTrafficDataView: TrafficDataView? = null protected var slidePanelView: SlidePanelView? = null //远景和中景的切换 private var mSwitchMapModeImage: ImageView? = null @@ -87,16 +85,13 @@ abstract class CharterBaseFragment?>() : override fun initViews() { mapBizView = findViewById(R.id.mapBizView) groupTestPanel = findViewById(R.id.groupTestPanel) - ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status) - ctvAutopilotStatusIv = findViewById(R.id.bus_autopilot_btn_iv) - ctvAutopilotStatusTv = findViewById(R.id.bus_autopolot_btn_tv) + ctvAutopilotStatus = findViewById(R.id.autopilot_status) flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container) slidePanelView = findViewById(R.id.charter_slide_panel) slidePanelView?.setText(resources.getString(R.string.charter_back_car)) slidePanelView?.setOnSlidePanelMoveToEndListener(onSlideToEndListener) - mTrafficDataView = findViewById(R.id.bus_arc) as TrafficDataView? LayoutInflater.from(context).inflate(getStationPanelViewId(), flStationPanelContainer) mSwitchMapModeLayout = findViewById(R.id.bus_switch_model_layout) mSwitchMapModeImage = findViewById(R.id.bus_switch_model_icon) @@ -122,12 +117,6 @@ abstract class CharterBaseFragment?>() : } }) initListener() - setAutopilotBtnStatus(getState()) - ctvAutopilotStatus!!.setOnClickListener(object : OnPreventFastClickListener() { - override fun onClickImpl(v: View) { - restartAutopilot() - } - }) // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接 findViewById(R.id.btnAutopilotDisable)!!.setOnClickListener { view: View? -> @@ -194,6 +183,11 @@ abstract class CharterBaseFragment?>() : } }) smallMapView = findViewById(R.id.smallMapView) + + ctvAutopilotStatus?.setOnLongClickListener { + debugTestBar() + true + } } override fun initViews(savedInstanceState: Bundle?) { @@ -308,90 +302,6 @@ abstract class CharterBaseFragment?>() : SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) } - /** - * 改变自动驾驶状态 - * - * @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中 - */ - fun onAutopilotStatusChanged(autopilotStatus: Int) { - requireActivity().runOnUiThread { - changeAutopilotBtnView( - autopilotStatus, - isAnimateRunning - ) - } - } - - private fun setAutopilotBtnStatus(autopilotStatus: Int) { - if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE - == autopilotStatus - ) { //0不可用 - ctvAutopilotStatusTv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_disable)) - ctvAutopilotStatusTv!!.text = - resources.getString(R.string.charter_loading_autopilot_runnig_tv) - ctvAutopilotStatusIv!!.setImageResource(R.drawable.charter_disable_autopilot_icon) -// ctvAutopilotStatus!!.isSelected = false - ctvAutopilotStatus!!.isClickable = true - ctvAutopilotStatus!!.background = getDrawable(R.drawable.charter_autopilot_0_1_status_bg) - }else{ - ctvAutopilotStatusTv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_normal)) - ctvAutopilotStatusIv!!.setImageResource(R.drawable.charter_ic_autopilot) - ctvAutopilotStatusTv!!.text = - resources.getString(R.string.charter_loading_autopilot_runnig_tv) - ctvAutopilotStatus!!.isClickable = true - if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == autopilotStatus) { //1可用 - ctvAutopilotStatus!!.background = getDrawable(R.drawable.charter_autopilot_0_1_status_bg) - } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == autopilotStatus) { - ctvAutopilotStatus!!.background = getDrawable(R.drawable.charter_autopilot_2_status_bg) - } else if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING - == autopilotStatus){ - ctvAutopilotStatusTv!!.text = - resources.getString(R.string.charter_loading_autopilot_pingxing_tv) - ctvAutopilotStatus!!.isClickable = false - ctvAutopilotStatus!!.background = getDrawable(R.drawable.charter_pingxingjiashi) - } - } - } - - open fun updateAutopilotStatus(autopilotStatus: Int) { - if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING - == autopilotStatus - ) { //2 running - ctvAutopilotStatusIv!!.setImageResource(R.drawable.charter_right_autopilot_icon) - ctvAutopilotStatusTv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_normal)) - ctvAutopilotStatusTv!!.text = - resources.getString(R.string.charter_loading_autopilot_success_tv) -// ctvAutopilotStatus!!.isSelected = false - ctvAutopilotStatus!!.isClickable = false - } else { - ctvAutopilotStatusIv!!.setImageResource(R.drawable.charter_wrong_autopilot_icon) - ctvAutopilotStatusTv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_normal)) - ctvAutopilotStatusTv!!.text = - resources.getString(R.string.charter_loading_autopilot_failure_tv) - ctvAutopilotStatus!!.isClickable = false -// ctvAutopilotStatus!!.isSelected = false - } - UiThreadHandler.postDelayed({ setAutopilotBtnStatus(autopilotStatus) }, 1000) - } - - private fun changeAutopilotBtnView(autopilotStatus: Int, isAnimateRunning: Boolean) { - if (isAnimateRunning && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING - != autopilotStatus - ) { - // 主动开启自动驾驶中,不为2(为0、1)则继续loading - return - } - if (isAnimateRunning) { - stopAnimAndUpdateBtnStatus() - } else { - setAutopilotBtnStatus(autopilotStatus) - } - } - - open fun stopAnimAndUpdateBtnStatus() { - stopAutopilotAnimation() - updateAutopilotStatus(getState()) - } /** @@ -408,74 +318,13 @@ abstract class CharterBaseFragment?>() : */ abstract fun getStationPanelViewId(): Int - /** - * 重新开启自动驾驶 - */ - abstract fun restartAutopilot() - /** * 模拟自动驾驶返回状态 * * @param status */ private fun debugAutoPilotStatus(status: Int){ - setAutopilotBtnStatus(status) - } - /** - * 开启自动驾驶中间动画 - */ - @SuppressLint("ObjectAnimatorBinding") - open fun startAutopilotAnimation() { - isAnimateRunning = true - ctvAutopilotStatusTv!!.text = resources.getString(R.string.charter_loading_autopilot_tv) - ctvAutopilotStatusTv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_normal)) -// ctvAutopilotStatus!!.isSelected = false - ctvAutopilotStatus!!.isClickable = true - ctvAutopilotStatusIv!!.setImageResource(R.drawable.charter_loading_autopilot_icon) - if (autopilotLoadingAnimator == null) { - autopilotLoadingAnimator = - ObjectAnimator.ofFloat(ctvAutopilotStatusIv, "rotation", 0f, 360f) - autopilotLoadingAnimator?.interpolator = LinearInterpolator() - autopilotLoadingAnimator?.repeatCount = -1 //无限循环 - autopilotLoadingAnimator?.duration = 1000 //设置持续时间 - } - autopilotLoadingAnimator!!.start() //动画开始 - startingAutoApilotCountDown() - } - - private fun startingAutoApilotCountDown() { - //10s 若自动驾驶没有开启,则结束动画 - UiThreadHandler.postDelayed({ - //未启动成功做处理 - if (isAnimateRunning) { // 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态 - stopAutopilotAnimation() - updateAutopilotStatus(getState()) - } - }, CharterConst.TIMER_START_AUTOPILOT_INTERVAL) - } - - /** - * 停止自动驾驶中间动画 - */ - protected open fun stopAutopilotAnimation() { - if (autopilotLoadingAnimator != null) { - autopilotLoadingAnimator!!.end() - ctvAutopilotStatusIv!!.clearAnimation() - autopilotLoadingAnimator = null - isAnimateRunning = false - } - } - - /** - * 迈速表实时更新 - * - * @param newSpeed - */ - open fun updateSpeedView(newSpeed: Float) { - val speed = (abs(newSpeed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值 - if (mTrafficDataView != null) { - mTrafficDataView!!.updateSpeedWithValue(speed) - } + ctvAutopilotStatus?.setAutopilotBtnStatus(status) } override fun onDestroy() { diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/callback/IBeautifyModeCallback.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/callback/IBeautifyModeCallback.kt new file mode 100644 index 0000000000..2670f4c73b --- /dev/null +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/callback/IBeautifyModeCallback.kt @@ -0,0 +1,7 @@ +package com.magic.mogo.och.charter.callback + +import com.magic.mogo.och.charter.manager.BeautifyManager + +interface IBeautifyModeCallback { + fun dispatchStatus(typeEnum: BeautifyManager.ChangeTypeEnum) +} \ No newline at end of file diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/fragment/DriverM1Fragment.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/fragment/DriverM1Fragment.kt index ecf8215f7a..c670bad905 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/fragment/DriverM1Fragment.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/fragment/DriverM1Fragment.kt @@ -168,13 +168,6 @@ class DriverM1Fragment : CharterBaseFragment() + + @Volatile + @JvmField + var isBeautifyMode = false + + init { + isBeautifyMode = FunctionBuildConfig.isDemoMode + BizLoopManager.setLoopFunction(TAG, LoopInfo(3, ::checkDemoMode)) + } + + private fun checkDemoMode() { + if(isBeautifyMode!=FunctionBuildConfig.isDemoMode){ + isBeautifyMode = FunctionBuildConfig.isDemoMode + notifyViewChange(ChangeTypeEnum.BEAUTIFY_TYPE) + } + } + + + fun setStatusChangeListener( + tag: String, + orderStatusChangeListener: IBeautifyModeCallback? + ) { + if (tag.isBlank()) return + if (orderStatusChangeListener == null) { + orderStatusChangeListeners.remove(tag) + return + } + orderStatusChangeListeners[tag] = orderStatusChangeListener + } + + + fun notifyViewChange(typeEnum: ChangeTypeEnum){ + CallerLogger.d(TAG,"美化模式变化原因:${typeEnum}") + orderStatusChangeListeners.forEach { + it.value.dispatchStatus(typeEnum) + } + } + +} \ No newline at end of file diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt index ab5996a55f..6d8131217c 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt @@ -36,8 +36,7 @@ import mogo_msg.MogoReportMsg */ class DriverM1Presenter(view: DriverM1Fragment?) : Presenter(view),ILoginCallback, DriverM1OrderCallback, ChangeDestCallback, - IMoGoAutopilotStatusListener, OCHPlanningActionsCallback, - IDriverM1ControllerStatusCallback { + IMoGoAutopilotStatusListener, OCHPlanningActionsCallback{ companion object{ private const val TAG = "DriverM1Presenter" @@ -55,7 +54,6 @@ class DriverM1Presenter(view: DriverM1Fragment?) : StopSideManager.addListener(TAG,this) DriverM1Model.get().setDriverM1OrderCallback(this) DriverM1Model.get().setChangeDestCallback(this) - DriverM1Model.get().setControllerStatusCallback(this) } private fun releaseListener() { @@ -63,7 +61,6 @@ class DriverM1Presenter(view: DriverM1Fragment?) : CallerAutoPilotStatusListenerManager.removeListener(TAG) DriverM1Model.get().setDriverM1OrderCallback(null) DriverM1Model.get().setChangeDestCallback(null) - DriverM1Model.get().setControllerStatusCallback(null) } override fun onDestroy(owner: LifecycleOwner) { @@ -92,13 +89,6 @@ class DriverM1Presenter(view: DriverM1Fragment?) : DriverM1Model.get().logout() } - fun restartAutopilot() { - // todo 启动自驾必须有订单路线 - if (DriverM1Model.get().isHaveOrder()) { - DriverM1Model.get().restartAutopilot() - } - } - fun driverEndLease() { DriverM1Model.get().driverEndLease() } @@ -145,7 +135,6 @@ class DriverM1Presenter(view: DriverM1Fragment?) : } override fun onAutopilotStatusResponse(state: Int) { - mView?.onAutopilotStatusChanged(state) when(state){ // IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> { // // @@ -193,21 +182,4 @@ class DriverM1Presenter(view: DriverM1Fragment?) : } } - override fun startOpenAutopilot() { - ThreadUtils.runOnUiThread { - mView?.startAutopilotAnimation() - } - } - - override fun onStartAdasFailure() { - ThreadUtils.runOnUiThread { - mView?.stopAnimAndUpdateBtnStatus() - } - } - - override fun updateSpeed(gnssInfo: MogoLocation) { - ThreadUtils.runOnUiThread { - mView?.updateSpeedView(gnssInfo.gnssSpeed) - } - } } diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/autopilot/AutopilotStatusView.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/autopilot/AutopilotStatusView.kt new file mode 100644 index 0000000000..3575f1593e --- /dev/null +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/autopilot/AutopilotStatusView.kt @@ -0,0 +1,189 @@ +package com.magic.mogo.och.charter.view.autopilot + +import android.animation.ObjectAnimator +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.animation.LinearInterpolator +import android.widget.RelativeLayout +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.magic.mogo.och.charter.R +import com.magic.mogo.och.charter.constant.CharterConst +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.util.ResourceUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import kotlinx.android.synthetic.main.charter_autopilot_status.view.bus_autopilot_btn_iv +import kotlinx.android.synthetic.main.charter_autopilot_status.view.bus_autopolot_btn_tv + +/** + * 剩余时间和结束订单入口 + */ +class AutopilotStatusView : RelativeLayout,AutopilotStatusViewModel.IAutopilotStatusCallback { + + private val TAG = "AutopilotStatusView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + var viewModel:AutopilotStatusViewModel?=null + + var isAnimateRunning = false + + private var autopilotLoadingAnimator: ObjectAnimator? = null + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.charter_autopilot_status, this, true) + onClick { + if (!isAnimateRunning) { + viewModel?.restartAutopilot() + } + } + } + + override fun startAutopilotAnimation() { + isAnimateRunning = true + bus_autopolot_btn_tv!!.text = resources.getString(R.string.charter_loading_autopilot_tv) + bus_autopolot_btn_tv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_normal)) +// ctvAutopilotStatus!!.isSelected = false + isClickable = true + bus_autopilot_btn_iv!!.setImageResource(R.drawable.charter_loading_autopilot_icon) + if (autopilotLoadingAnimator == null) { + autopilotLoadingAnimator = + ObjectAnimator.ofFloat(bus_autopilot_btn_iv, "rotation", 0f, 360f) + autopilotLoadingAnimator?.interpolator = LinearInterpolator() + autopilotLoadingAnimator?.repeatCount = -1 //无限循环 + autopilotLoadingAnimator?.duration = 1000 //设置持续时间 + } + autopilotLoadingAnimator!!.start() //动画开始 + startingAutoApilotCountDown() + } + + override fun stopAnimAndUpdateBtnStatus() { + stopAutopilotAnimation() + updateAutopilotStatus(CallerAutoPilotStatusListenerManager.getState()) + } + + override fun onAutopilotStatusChanged(autopilotStatus: Int) { + if (isAnimateRunning && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING + != autopilotStatus + ) { + // 主动开启自动驾驶中,不为2(为0、1)则继续loading + return + } + if (isAnimateRunning) { + stopAnimAndUpdateBtnStatus() + } else { + setAutopilotBtnStatus(autopilotStatus) + } + } + + private fun startingAutoApilotCountDown() { + //10s 若自动驾驶没有开启,则结束动画 + UiThreadHandler.postDelayed({ + //未启动成功做处理 + if (isAnimateRunning) { // 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态 + stopAutopilotAnimation() + updateAutopilotStatus(CallerAutoPilotStatusListenerManager.getState()) + } + }, CharterConst.TIMER_START_AUTOPILOT_INTERVAL) + } + + fun updateAutopilotStatus(autopilotStatus: Int) { + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING + == autopilotStatus + ) { //2 running + bus_autopilot_btn_iv!!.setImageResource(R.drawable.charter_right_autopilot_icon) + bus_autopolot_btn_tv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_normal)) + bus_autopolot_btn_tv!!.text = + resources.getString(R.string.charter_loading_autopilot_success_tv) +// ctvAutopilotStatus!!.isSelected = false + isClickable = false + } else { + bus_autopilot_btn_iv!!.setImageResource(R.drawable.charter_wrong_autopilot_icon) + bus_autopolot_btn_tv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_normal)) + bus_autopolot_btn_tv!!.text = + resources.getString(R.string.charter_loading_autopilot_failure_tv) + isClickable = false +// ctvAutopilotStatus!!.isSelected = false + } + UiThreadHandler.postDelayed({ setAutopilotBtnStatus(autopilotStatus) }, 1000) + } + + fun setAutopilotBtnStatus(autopilotStatus: Int) { + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE + == autopilotStatus + ) { //0不可用 + bus_autopolot_btn_tv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_disable)) + bus_autopolot_btn_tv!!.text = + resources.getString(R.string.charter_loading_autopilot_runnig_tv) + bus_autopilot_btn_iv!!.setImageResource(R.drawable.charter_disable_autopilot_icon) +// ctvAutopilotStatus!!.isSelected = false + isClickable = true + background = ResourceUtils.getDrawable(R.drawable.charter_autopilot_0_1_status_bg) + }else{ + bus_autopolot_btn_tv!!.setTextColor(resources.getColor(R.color.charter_autopilot_text_color_normal)) + bus_autopilot_btn_iv!!.setImageResource(R.drawable.charter_ic_autopilot) + bus_autopolot_btn_tv!!.text = + resources.getString(R.string.charter_loading_autopilot_runnig_tv) + isClickable = true + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == autopilotStatus) { //1可用 + background = + ResourceUtils.getDrawable(R.drawable.charter_autopilot_0_1_status_bg) + } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == autopilotStatus) { + background = + ResourceUtils.getDrawable(R.drawable.charter_autopilot_2_status_bg) + } else if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING == autopilotStatus){ + bus_autopolot_btn_tv!!.text = + resources.getString(R.string.charter_loading_autopilot_pingxing_tv) + isClickable = false + background = ResourceUtils.getDrawable(R.drawable.charter_pingxingjiashi) + } + } + } + + /** + * 停止自动驾驶中间动画 + */ + protected open fun stopAutopilotAnimation() { + if (autopilotLoadingAnimator != null) { + autopilotLoadingAnimator!!.end() + bus_autopilot_btn_iv!!.clearAnimation() + autopilotLoadingAnimator = null + isAnimateRunning = false + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(AutopilotStatusViewModel::class.java) + } + viewModel?.setAutopilotStatusCallback(this) + setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.getState()) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + } + + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + + +} \ No newline at end of file diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/autopilot/AutopilotStatusViewModel.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/autopilot/AutopilotStatusViewModel.kt new file mode 100644 index 0000000000..8e398b6b57 --- /dev/null +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/autopilot/AutopilotStatusViewModel.kt @@ -0,0 +1,68 @@ +package com.magic.mogo.och.charter.view.autopilot + +import androidx.lifecycle.ViewModel +import com.magic.mogo.och.charter.callback.IDriverM1ControllerStatusCallback +import com.magic.mogo.och.charter.model.DriverM1Model +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.utilcode.util.ThreadUtils + +class AutopilotStatusViewModel: ViewModel(), IDriverM1ControllerStatusCallback, + IMoGoAutopilotStatusListener { + + private val TAG = AutopilotStatusViewModel::class.java.simpleName + + private var viewCallback:IAutopilotStatusCallback?=null + + + init { + DriverM1Model.get().setControllerStatusCallback(this) + } + + override fun onCleared() { + super.onCleared() + this.viewCallback = null + CallerAutoPilotStatusListenerManager.removeListener(TAG) + } + + fun setAutopilotStatusCallback(viewCallback:IAutopilotStatusCallback){ + this.viewCallback = viewCallback + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + } + + fun restartAutopilot() { + // todo 启动自驾必须有订单路线 + if (DriverM1Model.get().isHaveOrder()) { + DriverM1Model.get().restartAutopilot() + } + } + + interface IAutopilotStatusCallback{ + fun startAutopilotAnimation() + fun stopAnimAndUpdateBtnStatus() + fun onAutopilotStatusChanged(state: Int) + } + + override fun startOpenAutopilot() { + ThreadUtils.runOnUiThread( { + this.viewCallback?.startAutopilotAnimation() + },ThreadUtils.MODE.QUEUE) + } + + override fun onStartAdasFailure() { + ThreadUtils.runOnUiThread( { + this.viewCallback?.stopAnimAndUpdateBtnStatus() + },ThreadUtils.MODE.QUEUE) + } + + override fun updateSpeed(gnssInfo: MogoLocation) { + } + + override fun onAutopilotStatusResponse(state: Int) { + ThreadUtils.runOnUiThread( { + this.viewCallback?.onAutopilotStatusChanged(state) + },ThreadUtils.MODE.QUEUE) + } + +} \ No newline at end of file diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusView.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusView.kt new file mode 100644 index 0000000000..3ea6d0e068 --- /dev/null +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusView.kt @@ -0,0 +1,40 @@ +package com.magic.mogo.och.charter.view.carstatus + +import android.content.Context +import android.util.AttributeSet +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.eagle.core.function.hmi.ui.widget.TrafficDataView + +class CarStatusView : TrafficDataView, CarStatusViewModel.ICarStatusCallback { + + private val TAG = "CarStatusView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + var viewModel:CarStatusViewModel?=null + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(CarStatusViewModel::class.java) + } + viewModel?.setAutopilotStatusCallback(this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + } + + override fun updateSpeedWithCurrentValue(speed: Int) { + updateSpeedWithValue(speed) + } +} \ No newline at end of file diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusViewModel.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusViewModel.kt new file mode 100644 index 0000000000..c64e42e8b9 --- /dev/null +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusViewModel.kt @@ -0,0 +1,48 @@ +package com.magic.mogo.och.charter.view.carstatus + +import androidx.lifecycle.ViewModel +import com.magic.mogo.och.charter.model.DriverM1Model +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import kotlin.math.abs + +class CarStatusViewModel: ViewModel(), IMoGoAutopilotStatusListener, + IMoGoChassisLocationGCJ02Listener { + + private val TAG = CarStatusViewModel::class.java.simpleName + + private var viewCallback:ICarStatusCallback?=null + + + init { + + } + + override fun onCleared() { + super.onCleared() + this.viewCallback = null + CallerChassisLocationGCJ02ListenerManager.removeListener(DriverM1Model.TAG) + } + + fun setAutopilotStatusCallback(viewCallback:ICarStatusCallback){ + this.viewCallback = viewCallback + CallerChassisLocationGCJ02ListenerManager.addListener(DriverM1Model.TAG, 10, this) + } + + interface ICarStatusCallback{ + fun updateSpeedWithCurrentValue(speed:Int) + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + mogoLocation?.let { + val speed = (abs(it.gnssSpeed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值 + ThreadUtils.runOnUiThread( { + viewCallback?.updateSpeedWithCurrentValue(speed) + },ThreadUtils.MODE.QUEUE) + } + } + +} \ No newline at end of file diff --git a/OCH/charter/driver/src/main/res/layout/charter_autopilot_status.xml b/OCH/charter/driver/src/main/res/layout/charter_autopilot_status.xml new file mode 100644 index 0000000000..ae9faef3d4 --- /dev/null +++ b/OCH/charter/driver/src/main/res/layout/charter_autopilot_status.xml @@ -0,0 +1,30 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml b/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml index 8497b888f8..b34a7b46ba 100644 --- a/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml +++ b/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml @@ -29,7 +29,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - + app:layout_constraintTop_toTopOf="parent"/> - - - - - + tools:visibility="visible" + android:layout_marginLeft="@dimen/dp_13"/> - - - - - diff --git a/OCH/charter/passenger/build.gradle b/OCH/charter/passenger/build.gradle index aca041d1ff..e84da8b7da 100644 --- a/OCH/charter/passenger/build.gradle +++ b/OCH/charter/passenger/build.gradle @@ -62,7 +62,9 @@ dependencies { implementation project(":OCH:mogo-och-common-module") compileOnly project(":libraries:mogo-map") implementation project(':core:mogo-core-res') - testImplementation 'junit:junit:4.12' + + androidTestImplementation rootProject.ext.dependencies.androidxjunit + testImplementation rootProject.ext.dependencies.junit } diff --git a/OCH/charter/passenger/src/main/AndroidManifest.xml b/OCH/charter/passenger/src/main/AndroidManifest.xml index e40c8b4775..05140a5254 100644 --- a/OCH/charter/passenger/src/main/AndroidManifest.xml +++ b/OCH/charter/passenger/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - + \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/MogoOCHBusPassenger.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/MogoOCHBusPassenger.kt index 13be59b9b7..33007cf843 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/MogoOCHBusPassenger.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/MogoOCHBusPassenger.kt @@ -44,8 +44,8 @@ class MogoOCHBusPassenger : IMoGoFunctionProvider { val supportFragmentManager: FragmentManager? = mActivity?.supportFragmentManager if (mPassengerFragment == null) { - d(SceneConstant.M_TAXI_P + com.mogo.och.charter.passenger.MogoOCHBusPassenger.Companion.TAG, "准备add fragment======") - var fragmentByTag: Fragment? = supportFragmentManager?.findFragmentByTag(MainFragment.TAG) + d(SceneConstant.M_TAXI_P + TAG, "准备add fragment======") + val fragmentByTag: Fragment? = supportFragmentManager?.findFragmentByTag(MainFragment.TAG) mPassengerFragment = if (fragmentByTag is MainFragment){ fragmentByTag }else{ @@ -58,7 +58,7 @@ class MogoOCHBusPassenger : IMoGoFunctionProvider { } return } - d(SceneConstant.M_TAXI_P + com.mogo.och.charter.passenger.MogoOCHBusPassenger.Companion.TAG, "准备show fragment") + d(SceneConstant.M_TAXI_P + TAG, "准备show fragment") supportFragmentManager?.beginTransaction()?.show(mPassengerFragment!!) ?.commitAllowingStateLoss() } @@ -71,6 +71,6 @@ class MogoOCHBusPassenger : IMoGoFunctionProvider { } companion object { - private val TAG = com.mogo.och.charter.passenger.MogoOCHBusPassenger::class.java.simpleName + private val TAG = MogoOCHBusPassenger::class.java.simpleName } } \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/callback/IBeautifyModeCallback.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/callback/IBeautifyModeCallback.kt new file mode 100644 index 0000000000..8c8481f71d --- /dev/null +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/callback/IBeautifyModeCallback.kt @@ -0,0 +1,7 @@ +package com.mogo.och.charter.passenger.callback + +import com.mogo.och.charter.passenger.utils.BeautifyManager + +interface IBeautifyModeCallback { + fun dispatchStatus(typeEnum: BeautifyManager.ChangeTypeEnum) +} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt index 7f7b84ffa4..9ecfcf55b4 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt @@ -30,6 +30,7 @@ import com.mogo.och.charter.passenger.callback.* import com.mogo.och.charter.passenger.constant.CharterPassengerConst import com.mogo.och.common.module.manager.loopmanager.BizLoopManager import com.mogo.och.charter.passenger.net.BusPassengerServiceManager +import com.mogo.och.charter.passenger.utils.BeautifyManager import com.mogo.och.common.module.wigets.toast.ToastCharterUtils import com.mogo.och.charter.passenger.utils.VoiceFocusManager import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg @@ -736,6 +737,7 @@ object CharterPassengerModel { d(M_BUS_P + TAG, "${this.orderInfo?.orderNo}新的状态:$orderStatus") OchChainLogManager.writeChainLog(this.orderInfo.toString(),"新的状态:$orderStatus") this.orderStatus = orderStatus + BeautifyManager.notifyViewChange(BeautifyManager.ChangeTypeEnum.ORDER_STATU_CHANGE) for (callback in orderStatusChangeListeners.values) { callback.onStatusChange(this.orderStatus) } @@ -964,6 +966,7 @@ object CharterPassengerModel { if (order != null && lineId != null && siteId != null) { OchChainLogManager.writeChainLog(this.orderInfo.toString(),"到站成功:${order.siteName}") + BeautifyManager.notifyViewChange(BeautifyManager.ChangeTypeEnum.ARRIVED_DEST) VoiceManager.arrivedStation( order.siteName!!, order.siteNameKr ?: "", diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/presenter/BusPassengerPresenter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/presenter/BusPassengerPresenter.kt index 5cc59a047f..4162fb60b3 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/presenter/BusPassengerPresenter.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/presenter/BusPassengerPresenter.kt @@ -32,6 +32,7 @@ import com.mogo.och.charter.passenger.receive.DriverMessage import com.mogo.och.charter.passenger.ui.MainFragment import com.mogo.och.charter.passenger.ui.overmapview.MakerWithSiteName import com.mogo.och.charter.passenger.ui.overmapview.MakerWithSiteNamewithCheck +import com.mogo.och.charter.passenger.utils.BeautifyManager import com.mogo.och.common.module.biz.network.OchCommonServiceCallback import com.mogo.och.common.module.manager.autopilotmanager.OCHAdasAbilityManager import com.mogo.och.common.module.manager.stopsidemanager.StopSideManager @@ -208,6 +209,7 @@ class BusPassengerPresenter(view: MainFragment?) : } StopSideStatus.EndingSuccess -> { + BeautifyManager.notifyViewChange(BeautifyManager.ChangeTypeEnum.STOPSITE_SUCCESS) ToastCharterUtils.showToastShort("靠边停车成功") VoiceNotice.showNotice( context.getString(R.string.charter_p_stop_site_success), diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/MainFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/MainFragment.kt index 6209889156..7e6fae56b7 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/MainFragment.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/MainFragment.kt @@ -42,9 +42,9 @@ import kotlinx.android.synthetic.main.charter_p_main_fragment.biz_softcontrol import kotlinx.android.synthetic.main.charter_p_main_fragment.biz_video import kotlinx.android.synthetic.main.charter_p_main_fragment.mapBizView import kotlinx.android.synthetic.main.charter_p_main_fragment.omvOverMap -import kotlinx.android.synthetic.main.charter_p_main_fragment.viewBusPM1MsgBoxBubble -import kotlinx.android.synthetic.main.charter_p_main_fragment.viewBusPM1MsgBoxButton -import kotlinx.android.synthetic.main.charter_p_main_fragment.viewBusPM1MsgBoxList +//import kotlinx.android.synthetic.main.charter_p_main_fragment.viewBusPM1MsgBoxBubble +//import kotlinx.android.synthetic.main.charter_p_main_fragment.viewBusPM1MsgBoxButton +//import kotlinx.android.synthetic.main.charter_p_main_fragment.viewBusPM1MsgBoxList import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -104,20 +104,20 @@ class MainFragment : MvpFragment(), IMogo override fun initViews() { omvOverMap.hideResetView() - viewBusPM1MsgBoxButton.setClickListener(object : MMsgBoxButtonView.ClickListener { - override fun showMsgBoxList(show: Boolean) { - if (show) { - viewBusPM1MsgBoxList.visibility = View.VISIBLE - viewBusPM1MsgBoxBubble.visibility = View.GONE - viewBusPM1MsgBoxBubble.isShowData(false) - } else { - viewBusPM1MsgBoxList.visibility = View.GONE - viewBusPM1MsgBoxBubble.visibility = View.VISIBLE - viewBusPM1MsgBoxBubble.isShowData(true) - } - } - - }) +// viewBusPM1MsgBoxButton.setClickListener(object : MMsgBoxButtonView.ClickListener { +// override fun showMsgBoxList(show: Boolean) { +// if (show) { +// viewBusPM1MsgBoxList.visibility = View.VISIBLE +// viewBusPM1MsgBoxBubble.visibility = View.GONE +// viewBusPM1MsgBoxBubble.isShowData(false) +// } else { +// viewBusPM1MsgBoxList.visibility = View.GONE +// viewBusPM1MsgBoxBubble.visibility = View.VISIBLE +// viewBusPM1MsgBoxBubble.isShowData(true) +// } +// } +// +// }) bb_boorombar.setCheckChangeListener(object : BottomBar.ApplyClickLintener { override fun onApplyClick(selectItem: BottomBar.SelectView): Boolean { diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/statusbar/StatusBarView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/statusbar/StatusBarView.kt index 888bdb0c7a..2a1d837714 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/statusbar/StatusBarView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/statusbar/StatusBarView.kt @@ -1,6 +1,5 @@ package com.mogo.och.charter.passenger.ui.statusbar -import android.annotation.SuppressLint import android.content.Context import android.os.SystemClock import android.util.AttributeSet @@ -14,22 +13,25 @@ import chassis.ChassisStatesOuterClass import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.autopilot.IMoGoBatteryManagementSystemListener -import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener -import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerBatteryManagementSystemListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager -import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager -import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager -import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.ClickUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.charter.passenger.R +import com.mogo.och.charter.passenger.bean.response.OrderInfoResponse +import com.mogo.och.charter.passenger.callback.IBeautifyModeCallback +import com.mogo.och.charter.passenger.model.CharterPassengerModel +import com.mogo.och.charter.passenger.model.OrderStatusEnum import com.mogo.och.charter.passenger.ui.debugview.DebugEvent +import com.mogo.och.charter.passenger.utils.BeautifyManager import com.mogo.och.common.module.manager.loopmanager.BizLoopManager import com.mogo.och.common.module.manager.loopmanager.LoopInfo +import com.mogo.och.common.module.manager.stopsidemanager.StopSideManager +import com.mogo.och.common.module.manager.stopsidemanager.StopSideStatus import kotlinx.android.synthetic.main.charter_p_statusview_datetime.view.aciv_connect_driver_status import kotlinx.android.synthetic.main.charter_p_statusview_datetime.view.actv_auto_status import kotlinx.android.synthetic.main.charter_p_statusview_datetime.view.bizz_view @@ -44,7 +46,8 @@ class StatusBarView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoSkinModeChangeListener, IViewControlListener, IMoGoBatteryManagementSystemListener, IMoGoAutopilotStatusListener { +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoBatteryManagementSystemListener, IMoGoAutopilotStatusListener, + IBeautifyModeCallback { companion object { const val TAG = "StatusBarView" @@ -85,17 +88,12 @@ class StatusBarView @JvmOverloads constructor( params.height = AutoSizeUtils.dp2px(context,47f) layoutParams = params } - //添加view控制 - CallerHmiViewControlListenerManager.addListener(TAG,this) - CallerHmiViewControlListenerManager.setListenerHz(TAG,5) - // 添加换肤监听 - CallerSkinModeListenerManager.addListener(TAG, this) - + //电池电量监听 CallerBatteryManagementSystemListenerManager.addListener(TAG,this) - + //自动驾驶状态监听 CallerAutoPilotStatusListenerManager.addListener(TAG, this) - updateStatusBarRightView(FunctionBuildConfig.isDemoMode, "demoMode", DemoModeView(this.context)) + BeautifyManager.setStatusChangeListener(TAG,this) bizz_view.setOnClickListener { continuousClick(bizz) } @@ -104,8 +102,7 @@ class StatusBarView @JvmOverloads constructor( progress.progress = 50 tv_power_cos.text = "50%" - val state = CallerAutoPilotStatusListenerManager.getState() - setAutoPilotStatusInfo(state) + setAutoPilotStatusInfo(CallerAutoPilotStatusListenerManager.getState()) BizLoopManager.setLoopFunction(TAG, LoopInfo(3, ::showConnectStatusWithDriver)) } @@ -122,27 +119,60 @@ class StatusBarView @JvmOverloads constructor( } private fun setAutoPilotStatusInfo(state: Int) { - when (state) { - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> { - actv_auto_status.text = "安全接管中" + if (FunctionBuildConfig.isDemoMode) {// 美化模式 + val gnssSpeed = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().gnssSpeed + actv_auto_status.text = "自动驾驶中" + when (CharterPassengerModel.getCurrentOrderStatus()) { + OrderStatusEnum.Nothing -> {// 初始状态 + //是否强制绘制引导线 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false + } + OrderStatusEnum.NoOrderUnuse -> {//无订单车闲置 + //是否强制绘制引导线 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false + } + OrderStatusEnum.OrderNoLine -> {//有订单无线路 + //是否强制绘制引导线 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false + } + OrderStatusEnum.OrdersWithLine -> {//有订单有线路 是否到站 + //是否强制绘制引导线 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = gnssSpeed>0.3 + CharterPassengerModel.getCurrentOrderInfo()?.let { + if(it.arriveStatus == OrderInfoResponse.ARRIVED){ + // 到站不绘制引导线 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false + return + } + if (StopSideManager.stopSiteStatus== StopSideStatus.EndingSuccess) { + // 靠边停车成功不绘制引导线 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false + return + } + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true + } + } + OrderStatusEnum.NoOrderUse -> {// 无订单车不闲置 + //是否强制绘制引导线 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false + } } - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> { - actv_auto_status.text = "安全接管中" + }else{ + when (state) { + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> { + actv_auto_status.text = "安全接管中" + } + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> { + actv_auto_status.text = "安全接管中" + } + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { + actv_auto_status.text = "自动驾驶中" + } + IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> { + actv_auto_status.text = "远程代驾中" + } + else -> {} } - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { - actv_auto_status.text = "自动驾驶中" - } - IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> { - actv_auto_status.text = "远程代驾中" - } - else -> {} - } - } - - override fun onSkinModeChange(skinMode: Int) { - when (skinMode) { - 0 -> setStatusBarDarkOrLight(false) - 1 -> setStatusBarDarkOrLight(true) } } @@ -152,21 +182,16 @@ class StatusBarView @JvmOverloads constructor( } } - override fun updateStatusBarLeftView(insert: Boolean, tag: String, viewGroup: ViewGroup) { - - } - - @SuppressLint("SetTextI18n") - override fun updateStatusBarDownloadView(insert: Boolean, tag: String, progress: Int) { - - } - override fun onDetachedFromWindow() { super.onDetachedFromWindow() - CallerHmiViewControlListenerManager.removeListener(TAG) - CallerSkinModeListenerManager.removeListener(TAG) CallerDevaToolsManager.hideStatusBar() + //定时任务 BizLoopManager.removeLoopFunction(TAG) + //电池电量监听 + CallerBatteryManagementSystemListenerManager.removeListener(TAG) + //自动驾驶状态监听 + CallerAutoPilotStatusListenerManager.removeListener(TAG) + BeautifyManager.setStatusChangeListener(TAG,null) } override fun onBatteryManagementSystemStates(states: ChassisStatesOuterClass.BMSSystemStates) { @@ -179,5 +204,11 @@ class StatusBarView @JvmOverloads constructor( tv_power_cos.text = "${bmsSoc.roundToInt()}%" } } + + override fun dispatchStatus(typeEnum: BeautifyManager.ChangeTypeEnum) { + UiThreadHandler.post( { + setAutoPilotStatusInfo(CallerAutoPilotStatusListenerManager.getState()) + },UiThreadHandler.MODE.QUEUE) + } } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/BeautifyManager.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/BeautifyManager.kt new file mode 100644 index 0000000000..aab0b204bb --- /dev/null +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/BeautifyManager.kt @@ -0,0 +1,61 @@ +package com.mogo.och.charter.passenger.utils + +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.charter.passenger.callback.IBeautifyModeCallback +import com.mogo.och.charter.passenger.ui.statusbar.StatusBarView +import com.mogo.och.common.module.manager.loopmanager.BizLoopManager +import com.mogo.och.common.module.manager.loopmanager.LoopInfo +import java.util.concurrent.ConcurrentHashMap + +object BeautifyManager { + + private val TAG = BeautifyManager::class.java.simpleName + + enum class ChangeTypeEnum{ + BEAUTIFY_TYPE,// 美化模式变化 + ORDER_STATU_CHANGE,// 订单状态发生变化 + ARRIVED_DEST,// 到站 + STOPSITE_SUCCESS// 靠边停车成功 + } + + private val orderStatusChangeListeners = ConcurrentHashMap() + + @Volatile + @JvmField + var isBeautifyMode = false + + init { + isBeautifyMode = FunctionBuildConfig.isDemoMode + BizLoopManager.setLoopFunction(TAG, LoopInfo(3, ::checkDemoMode)) + } + + private fun checkDemoMode() { + if(isBeautifyMode!=FunctionBuildConfig.isDemoMode){ + isBeautifyMode = FunctionBuildConfig.isDemoMode + notifyViewChange(ChangeTypeEnum.BEAUTIFY_TYPE) + } + } + + + fun setStatusChangeListener( + tag: String, + orderStatusChangeListener: IBeautifyModeCallback? + ) { + if (tag.isBlank()) return + if (orderStatusChangeListener == null) { + orderStatusChangeListeners.remove(tag) + return + } + orderStatusChangeListeners[tag] = orderStatusChangeListener + } + + + fun notifyViewChange(typeEnum: ChangeTypeEnum){ + CallerLogger.d(TAG,"美化模式变化原因:${typeEnum}") + orderStatusChangeListeners.forEach { + it.value.dispatchStatus(typeEnum) + } + } + +} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/BusPassengerMapAssetStyleUtil.java b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/BusPassengerMapAssetStyleUtil.java index 09807fa2b8..b2da8e2513 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/BusPassengerMapAssetStyleUtil.java +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/BusPassengerMapAssetStyleUtil.java @@ -19,7 +19,10 @@ public class BusPassengerMapAssetStyleUtil { is1 = context.getResources().getAssets().open(fileName); //eg. over_view_style.data int lenght1 = is1.available(); buffer1 = new byte[lenght1]; - is1.read(buffer1); + int count = 0; + while ((count = is1.read(buffer1)) > 0) { + is1.read(buffer1); + } } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/OCH/charter/passenger/src/main/res/layout/charter_p_devices_unlock.xml b/OCH/charter/passenger/src/main/res/layout/charter_p_devices_unlock.xml index 1d0f8c7b27..944b5ff4ff 100644 --- a/OCH/charter/passenger/src/main/res/layout/charter_p_devices_unlock.xml +++ b/OCH/charter/passenger/src/main/res/layout/charter_p_devices_unlock.xml @@ -50,9 +50,10 @@ diff --git a/OCH/charter/passenger/src/main/res/layout/charter_p_main_fragment.xml b/OCH/charter/passenger/src/main/res/layout/charter_p_main_fragment.xml index 96a4bc6821..43dcded38a 100644 --- a/OCH/charter/passenger/src/main/res/layout/charter_p_main_fragment.xml +++ b/OCH/charter/passenger/src/main/res/layout/charter_p_main_fragment.xml @@ -7,7 +7,7 @@ + + @@ -52,45 +62,24 @@ app:layout_constraintEnd_toEndOf="@+id/mapBizView" app:layout_constraintStart_toStartOf="parent" /> - - - - - - - + + app:layout_constraintEnd_toEndOf="@+id/zv_msg_pop_bottom" + app:layout_constraintBottom_toTopOf="@+id/zv_msg_pop_bottom" /> - + app:layout_constraintBottom_toTopOf="@+id/bb_boorombar" + android:layout_marginBottom="@dimen/dp_m_2" + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt index 3b4fd0068a..06b0a3311b 100644 --- a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt @@ -44,7 +44,7 @@ object DebugDataDispatch { const val trajectoryStation = "trajectoryStation" const val showDebugView = "showDebugView" -// aadb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "location" --es path "1111/11111" +// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "location" --es path "1111/11111" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "globalPath" --es path "sy73.json" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "carDoor" --ei doorPostion 1 --ei doorStatus 1 // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "trunAroud" --es code "IMAP_TRA_LOADED" @@ -53,10 +53,14 @@ object DebugDataDispatch { val ROOT_PATH = - Environment.getExternalStorageDirectory().absolutePath + File.separator + "MLog" + File.separator + "APPLog" + File.separator //程序外部存储跟目录 + Environment.getExternalStorageDirectory().absolutePath + File.separator + "MLog" + File.separator + "APP_mock" + File.separator //程序外部存储跟目录 fun disPathc(type: String?, frequency: Int, sourceFilePath: String?, intent: Intent) { + val file = File(ROOT_PATH); + if(file.exists()){ + + } when (type) { globalPathMock -> { sourceFilePath?.let { 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 index a8ae762168..f4218e1544 100644 --- 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 @@ -13,13 +13,17 @@ public class CollectionUtils { 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(); + if(pro != null){ + pro.setAccessible(true); + List modifierList; + try { + modifierList = (List) pro.get(interceptors); + if(modifierList != null){ + modifierList.add(new SimpleInterceptor()); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } } } /** @@ -32,7 +36,10 @@ public class CollectionUtils { * @since:2019年2月26日 下午4:06:16 */ public static Field getDeclaredField(Object object, String fieldName){ - Field field = null ; + if(fieldName == null){ + return null; + } + Field field; Class clazz = object.getClass() ; for(; clazz != Object.class ; clazz = clazz.getSuperclass()) { try { diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java index 2a88ec1dd2..4f8e8db05e 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java @@ -14,7 +14,7 @@ public class NumberFormatUtil { * @return */ public static String formatLong(double d) { - BigDecimal bg = new BigDecimal(d).setScale(1, RoundingMode.HALF_UP); + BigDecimal bg = BigDecimal.valueOf(d).setScale(1, RoundingMode.HALF_UP); double num = bg.doubleValue(); if (Math.ceil(num) - num == 0) { return String.valueOf((long) num); diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/OCHThreadPoolManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/OCHThreadPoolManager.java index 02a08f49b2..8eb92a1132 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/OCHThreadPoolManager.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/OCHThreadPoolManager.java @@ -7,11 +7,6 @@ import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -/** - * @author: wangmingjun - * @date: 2022/7/19 - */ - public class OCHThreadPoolManager { /** @@ -42,10 +37,11 @@ public class OCHThreadPoolManager { } private volatile static OCHThreadPoolManager INSTANCE; + private static final byte[] obj = new byte[0]; public static OCHThreadPoolManager getsInstance() { if (INSTANCE == null) { - synchronized (OCHThreadPoolManager.class) { + synchronized (obj) { if (INSTANCE == null) { INSTANCE = new OCHThreadPoolManager(); } @@ -57,12 +53,10 @@ public class OCHThreadPoolManager { /** * 开启一个无返回结果的线程 - * - * @param r */ public void execute(Runnable r) { if (executor == null) { - /** + /* * corePoolSize:核心线程数 * maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启) * keepAliveTime:非核心线程闲置时间超时时长 @@ -73,7 +67,7 @@ public class OCHThreadPoolManager { * */ executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, - KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue(200), + KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); } // 把一个任务丢到了线程池中 @@ -87,13 +81,10 @@ public class OCHThreadPoolManager { /** * 开启一个有返回结果的线程 - * - * @param r - * @return */ public Future submit(Callable r) { if (executor == null) { - /** + /* * corePoolSize:核心线程数 * maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启) * keepAliveTime:非核心线程闲置时间超时时长 @@ -104,7 +95,7 @@ public class OCHThreadPoolManager { * */ executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, - KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue(20), + KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue<>(20), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); } // 把一个任务丢到了线程池中 @@ -113,12 +104,10 @@ public class OCHThreadPoolManager { /** * 开启一个无返回结果的线程 - * - * @param r */ public Future submit(Runnable r) { if (executor == null) { - /** + /* * corePoolSize:核心线程数 * maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启) * keepAliveTime:非核心线程闲置时间超时时长 @@ -129,7 +118,7 @@ public class OCHThreadPoolManager { * */ executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, - KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue(200), + KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); } return executor.submit(r); @@ -138,8 +127,6 @@ public class OCHThreadPoolManager { /** * 把任务移除等待队列 - * - * @param r */ public void cancel(Runnable r) { if (r != null) { diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java index 74c80b8abd..3d785f53dc 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java @@ -1,15 +1,10 @@ package com.mogo.och.common.module.utils; +import android.annotation.SuppressLint; import android.media.*; import android.content.*; -import android.os.*; import android.app.*; -/** - * @author: wangmingjun - * @date: 2022/9/23 - * - */ public class SoundPoolHelper { private SoundPool mSoundPool; private AudioManager mAudioManager; @@ -22,20 +17,16 @@ public class SoundPoolHelper { private int resId; private Context mContext; - private volatile static SoundPoolHelper INSTANCE; + private SoundPoolHelper(){} public static SoundPoolHelper getSoundPoolHelper(){ - if (INSTANCE == null){ - synchronized (SoundPoolHelper.class){ - if (INSTANCE == null){ - INSTANCE = new SoundPoolHelper(); - } - } - } - return INSTANCE; + return Holder.INSTANCE; } - public SoundPoolHelper(){} + private static final class Holder{ + @SuppressLint("StaticFieldLeak") + private static final SoundPoolHelper INSTANCE = new SoundPoolHelper(); + } //播放资源文件 public void playSoundWithRedId(Context context,int resId){ @@ -64,30 +55,19 @@ public class SoundPoolHelper { if (mSoundPool == null){ // For Android SDK >= 21 - if (Build.VERSION.SDK_INT >= 21 ) { + AudioAttributes audioAttrib = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_GAME) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build(); - AudioAttributes audioAttrib = new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_GAME) - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .build(); + SoundPool.Builder builder= new SoundPool.Builder(); + builder.setAudioAttributes(audioAttrib).setMaxStreams(MAX_STREAMS); - SoundPool.Builder builder= new SoundPool.Builder(); - builder.setAudioAttributes(audioAttrib).setMaxStreams(MAX_STREAMS); - - this.mSoundPool = builder.build(); - } else {// for Android SDK < 21 - // SoundPool(int maxStreams, int streamType, int srcQuality) - this.mSoundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0); - } + this.mSoundPool = builder.build(); } // When Sound Pool load complete. - this.mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { - @Override - public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { - playSound(); - } - }); + this.mSoundPool.setOnLoadCompleteListener((soundPool, sampleId, status) -> playSound()); //load res this.mSoundId =this.mSoundPool.load(this.mContext,this.resId,1); @@ -105,14 +85,12 @@ public class SoundPoolHelper { } } - - //play the sound res private void playSound(){ - float leftVolumn = volume; - float rightVolumn = volume; + float leftVolume = volume; + float rightVolume = volume; // Play sound of gunfire. Returns the ID of the new stream. - int streamId = this.mSoundPool.play(this.mSoundId,leftVolumn, rightVolumn, 1, 0, 1f); + int streamId = this.mSoundPool.play(this.mSoundId,leftVolume, rightVolume, 1, 0, 1f); } } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java index bd549f2888..5a03ce7e90 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java @@ -26,7 +26,7 @@ public class MarqueeTextView extends androidx.appcompat.widget.AppCompatTextView /** * 是否使用自定义 gap */ - private boolean mUseCustomGap; + private final boolean mUseCustomGap; public MarqueeTextView(Context context) { this(context, null); @@ -60,7 +60,6 @@ public class MarqueeTextView extends androidx.appcompat.widget.AppCompatTextView @Override public void onWindowFocusChanged(boolean hasWindowFocus) { - if (hasWindowFocus){} super.onWindowFocusChanged(true); } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHGradientTextView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHGradientTextView.java index 41fe2c2e02..914736a270 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHGradientTextView.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHGradientTextView.java @@ -21,7 +21,7 @@ public class OCHGradientTextView extends AppCompatTextView { private Paint mPaint; private int mViewWidth = 0;//文字的宽度 private int mViewHeight = 0;//文字的高度 - private Rect mTextBound = new Rect(); + private final Rect mTextBound = new Rect(); private int[] mColorList;//存放颜色的数组 private boolean isVertrial;//默认是横向 @@ -60,7 +60,7 @@ public class OCHGradientTextView extends AppCompatTextView { mPaint.setShadowLayer(mRadius, mdx, mdy, mColor); //画出文字 - canvas.drawText(mTipText, getMeasuredWidth() / 2 - mTextBound.width() / 2, getMeasuredHeight() / 2 + mTextBound.height() / 2, mPaint); + canvas.drawText(mTipText, getMeasuredWidth() / 2.0f - mTextBound.width() / 2.0f, getMeasuredHeight() / 2.0f + mTextBound.height() / 2.0f, mPaint); } /** diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHShapeBlurView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHShapeBlurView.java index b9170190c3..c86ec1b646 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHShapeBlurView.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHShapeBlurView.java @@ -22,18 +22,18 @@ import com.mogo.och.common.module.R; public class OCHShapeBlurView extends OCHStockBlurView { Paint mPaint; RectF mRectF; - private float mRadius; - private int mTopColor; // default #aaffffff - private int mBottomColor; // default #aaffffff + private final float mRadius; + private final int mTopColor; // default #aaffffff + private final int mBottomColor; // default #aaffffff public OCHShapeBlurView(Context context, AttributeSet attrs) { super(context, attrs); - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.OCHRShapeBlurView); - mRadius = a.getDimension(R.styleable.OCHRShapeBlurView_och_realtime_radius, + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.OCHShapeBlurView); + mRadius = a.getDimension(R.styleable.OCHShapeBlurView_och_realtime_radius, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 0, context.getResources().getDisplayMetrics())); - mTopColor = a.getColor(R.styleable.OCHRShapeBlurView_och_realtime_start_color, 0xAAFFFFFF); - mBottomColor = a.getColor(R.styleable.OCHRShapeBlurView_och_realtime_end_color, 0xAAFFFFFF); + mTopColor = a.getColor(R.styleable.OCHShapeBlurView_och_realtime_start_color, 0xAAFFFFFF); + mBottomColor = a.getColor(R.styleable.OCHShapeBlurView_och_realtime_end_color, 0xAAFFFFFF); a.recycle(); mPaint = new Paint(); mRectF = new RectF(); @@ -60,7 +60,7 @@ public class OCHShapeBlurView extends OCHStockBlurView { mPaint.reset(); mPaint.setAntiAlias(true); /* 设置渐变色 这个正方形的颜色是改变的 */ - Shader mShader = new LinearGradient(getWidth()/2, 0, getWidth()/2, getHeight(), + Shader mShader = new LinearGradient(getWidth()/2.0f, 0, getWidth()/2.0f, getHeight(), new int[] {mTopColor,mBottomColor}, null, Shader.TileMode.CLAMP); // 一个材质,打造出一个线性梯度沿著一条线。 mPaint.setShader(mShader);//0xBFE0E8FF,0xBF6AA2D7 canvas.drawRoundRect(mRectF, mRadius,mRadius,mPaint); diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHStockBlurView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHStockBlurView.java index f88571b949..ea20446982 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHStockBlurView.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHStockBlurView.java @@ -24,13 +24,13 @@ public class OCHStockBlurView extends View { private float mDownsampleFactor; // default 4 private int mOverlayColor; // default #aaffffff private float mBlurRadius; // default 10dp (0 < r <= 25) - private boolean onece; + private final boolean onece; private boolean mDirty; private Bitmap mBitmapToBlur, mBlurredBitmap; private Canvas mBlurringCanvas; private boolean mIsRendering; - private Paint mPaint; + private final Paint mPaint; private final Rect mRectSrc = new Rect(), mRectDst = new Rect(); // mDecorView should be the root view of the activity (even if you are on a different window like a dialog) private View mDecorView; @@ -149,9 +149,11 @@ public class OCHStockBlurView extends View { } finally { if (!r) { release(); - return false; } } + if (!r) { + return false; + } } if (dirty) { @@ -216,7 +218,9 @@ public class OCHStockBlurView extends View { } } if(onece) { - mDecorView.getViewTreeObserver().removeOnPreDrawListener(this); + if(mDecorView!=null) { + mDecorView.getViewTreeObserver().removeOnPreDrawListener(this); + } } return true; } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/ZhiView.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/ZhiView.kt new file mode 100644 index 0000000000..52dc9431ea --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/ZhiView.kt @@ -0,0 +1,207 @@ +package com.mogo.och.common.module.wigets + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.VoiceMsg +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.common.module.R +import com.mogo.och.common.module.utils.FrameAnimatorContainer +import com.mogo.tts.base.zhi.AsrTextBean +import com.mogo.tts.base.zhi.CallbackWidget +import com.mogo.tts.base.zhi.AvatarManager +import com.mogo.tts.base.zhi.ZhiRecordWinUi + +class ZhiView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatImageView(context, attrs, defStyleAttr), + ZhiRecordWinUi { + companion object { + const val TAG = "ZhiView" + } + + private var normalAnim: FrameAnimatorContainer?=null + private var listeningAnim: FrameAnimatorContainer?=null + private var understandingAnim: FrameAnimatorContainer?=null + private var speakingAnim: FrameAnimatorContainer?=null + + @Volatile + private var currentAni:FrameAnimatorContainer?=null + + init { + normalAnim = FrameAnimatorContainer(R.array.xiaozhi_normal, 20,this) + normalAnim?.setOnAnimStopListener(object : FrameAnimatorContainer.OnAnimationStoppedListener{ + override fun AnimationStopped() { + CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "常态动画暂停") + currentAni?.reStart() + } + }) + + listeningAnim = FrameAnimatorContainer(R.array.xiaozhi_normal, 20,this) + listeningAnim?.setOnAnimStopListener(object : FrameAnimatorContainer.OnAnimationStoppedListener{ + override fun AnimationStopped() { + CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "侦听动画暂停") + currentAni?.reStart() + } + }) + + understandingAnim = FrameAnimatorContainer(R.array.xiaozhi_normal, 20,this) + understandingAnim?.setOnAnimStopListener(object : FrameAnimatorContainer.OnAnimationStoppedListener{ + override fun AnimationStopped() { + CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "理解中动画暂停") + currentAni?.reStart() + } + }) + + speakingAnim = FrameAnimatorContainer(R.array.xiaozhi_normal, 20,this) + speakingAnim?.setOnAnimStopListener(object : FrameAnimatorContainer.OnAnimationStoppedListener{ + override fun AnimationStopped() { + CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "说话动画暂停") + currentAni?.reStart() + } + }) + + currentAni = normalAnim + + onClick { + AvatarManager.wakeupXiaoZhi() + } + } + + override fun onWindowFocusChanged(hasWindowFocus: Boolean) { + super.onWindowFocusChanged(hasWindowFocus) + CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG, "焦点与否:${hasWindowFocus}") + AvatarManager.enableXiaoZhi(!hasWindowFocus) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + AvatarManager.addDistanceListener(TAG,this) + normalAnim?.reStart() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + AvatarManager.removeListener(TAG) + } + + override fun start(reason: String?) { + CallerLogger.d(TAG,"-----start $reason") + val msg = VoiceMsg( + isWakeUp = true, + isWakeUpEnd = false, + msg = "", + isLastMsg = true, + isResp = true + ) + pushMsgBox(msg) + } + + override fun onStatusChange(status: ZhiRecordWinUi.RecordStatus?) { + CallerLogger.d(TAG,"-----onStatusChange $status") + + + when (status) { + ZhiRecordWinUi.RecordStatus.STATUS_SILENCE -> {} + ZhiRecordWinUi.RecordStatus.STATUS_LISTENING -> { + // 正在听取 + currentAni?.stop() + currentAni = listeningAnim + } + ZhiRecordWinUi.RecordStatus.STATUS_UNDERSTANDING -> { + // 正在理解 + currentAni?.stop() + currentAni = understandingAnim + } + ZhiRecordWinUi.RecordStatus.STATUS_UNDERSTAND_END -> { + + } + ZhiRecordWinUi.RecordStatus.STATUS_SPEAKING -> { + // 正在说话 + currentAni?.stop() + currentAni = speakingAnim + } + else -> { + + } + } + + + + + } + + override fun close(trigger: Boolean) { + CallerLogger.d(TAG,"-----close $trigger") + currentAni?.stop() + currentAni = normalAnim + val msg = VoiceMsg( + isWakeUp = false, + isWakeUpEnd = true, + msg = null, + isLastMsg = true, + isResp = true + ) + pushMsgBox(msg) + } + + + override fun onVolumeChange(volume: Int) { + CallerLogger.d(TAG,"-----onVolumeChange $volume") + } + + /** + * 用户输入的 + */ + override fun showInputText(asrTextBean: AsrTextBean?) { + CallerLogger.d(TAG,"-----showInputText $asrTextBean") + asrTextBean.let { + val msg = VoiceMsg( + isWakeUp = false, + isWakeUpEnd = false, + msg = it?.text, + isLastMsg = it?.isLast == true, + isResp = false + ) + pushMsgBox(msg) + } + } + + /** + * 特定View + */ + override fun showOutPutWidget(callbackWidget: CallbackWidget?) { + // todo 咱不支持定制显示 包括天气 + CallerLogger.d(TAG,"-----showOutPutWidget $callbackWidget") + } + + /** + * 小智说的 + */ + override fun showOutputText(outPutText: String?) { + CallerLogger.d(TAG,"-----showOutputText $outPutText") + outPutText?.let { + val msg = VoiceMsg( + isWakeUp = false, + isWakeUpEnd = false, + msg = it, + isLastMsg = false, + isResp = true + ) + pushMsgBox(msg) + } + } + + private fun pushMsgBox(msg:VoiceMsg){ + CallerMsgBoxManager.saveMsgBox(MsgBoxBean(MsgBoxType.VOICE, msg)) + } + + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java index 08b77de55c..7b3ddd377a 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java @@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicInteger; */ public class FrameSurfaceView extends BaseSurfaceView { public static final int INVALID_INDEX = Integer.MAX_VALUE; - private int bufferSize = 3; + private final int bufferSize = 3; public static final String DECODE_THREAD_NAME = "DecodingThread"; public static final int INFINITE = -1; //-1 means repeat infinitely @@ -45,12 +45,12 @@ public class FrameSurfaceView extends BaseSurfaceView { * decoded bitmaps stores in this queue * consumer is drawing thread, producer is decoding thread. */ - private LinkedBlockingQueue decodedBitmaps = new LinkedBlockingQueue(bufferSize); + private final LinkedBlockingQueue decodedBitmaps = new LinkedBlockingQueue(bufferSize); /** * bitmaps already drawn by canvas stores in this queue * consumer is decoding thread, producer is drawing thread. */ - private LinkedBlockingQueue drawnBitmaps = new LinkedBlockingQueue(bufferSize); + private final LinkedBlockingQueue drawnBitmaps = new LinkedBlockingQueue(bufferSize); /** * the thread for decoding bitmaps */ @@ -64,9 +64,9 @@ public class FrameSurfaceView extends BaseSurfaceView { */ private Handler handler; private BitmapFactory.Options options; - private Paint paint = new Paint(); + private final Paint paint = new Paint(); private Rect srcRect; - private Rect dstRect = new Rect(); + private final Rect dstRect = new Rect(); private int defaultWidth; private int defaultHeight; @@ -138,7 +138,7 @@ public class FrameSurfaceView extends BaseSurfaceView { return; } this.bitmapIds = bitmapIds; - //by default, take the first bitmap's dimension into consideration + //by default, take the first bitMap's dimension into consideration getBitmapDimension(bitmapIds.get(bitmapIdIndex)); preloadFrames(); decodeRunnable = new DecodeRunnable(bitmapIdIndex, bitmapIds, options); @@ -203,8 +203,6 @@ public class FrameSurfaceView extends BaseSurfaceView { /** * draw a single frame which is a bitmap - * - * @param canvas */ private void drawOneFrame(Canvas canvas) { LinkedBitmap linkedBitmap = getDecodedBitmap(); @@ -214,12 +212,7 @@ public class FrameSurfaceView extends BaseSurfaceView { putDrawnBitmap(linkedBitmap); frameIndex.incrementAndGet(); if(isFinish()&&frameFinishCallback!=null){ - runOnUIThread(new Runnable() { - @Override - public void run() { - frameFinishCallback.onFinishCallback(); - } - }); + runOnUIThread(() -> frameFinishCallback.onFinishCallback()); } } @@ -271,8 +264,8 @@ public class FrameSurfaceView extends BaseSurfaceView { } if (decodeRunnable != null) { decodeRunnable.setIndex(0); + handler.post(decodeRunnable); } - handler.post(decodeRunnable); } @@ -290,8 +283,8 @@ public class FrameSurfaceView extends BaseSurfaceView { * decode bitmap by BitmapFactory.decodeStream(), it is about twice faster than BitmapFactory.decodeResource() * * @param resId the bitmap resource - * @param options - * @return + * @param options options + * @return Bitmap */ private Bitmap decodeBitmap(int resId, BitmapFactory.Options options) { options.inScaled = false; @@ -322,8 +315,7 @@ public class FrameSurfaceView extends BaseSurfaceView { * @param linkedBitmap */ private void decodeAndPutBitmap(int resId, BitmapFactory.Options options, LinkedBitmap linkedBitmap) { - Bitmap bitmap = decodeBitmap(resId, options); - linkedBitmap.bitmap = bitmap; + linkedBitmap.bitmap = decodeBitmap(resId, options); try { decodedBitmaps.put(linkedBitmap); } catch (InterruptedException e) { @@ -377,8 +369,8 @@ public class FrameSurfaceView extends BaseSurfaceView { private class DecodeRunnable implements Runnable { private int index; - private List bitmapIds; - private BitmapFactory.Options options; + private final List bitmapIds; + private final BitmapFactory.Options options; public DecodeRunnable(int index, List bitmapIds, BitmapFactory.Options options) { this.index = index; diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_00.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_00.webp new file mode 100644 index 0000000000..59736772d9 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_00.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_01.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_01.webp new file mode 100644 index 0000000000..3b6a5b7842 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_01.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_02.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_02.webp new file mode 100644 index 0000000000..8d3f711e2d Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_02.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_03.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_03.webp new file mode 100644 index 0000000000..495e958dfb Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_03.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_04.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_04.webp new file mode 100644 index 0000000000..4207e95be5 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_04.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_05.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_05.webp new file mode 100644 index 0000000000..8d2a9a1120 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_05.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_06.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_06.webp new file mode 100644 index 0000000000..b9ba4ec7fe Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_06.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_07.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_07.webp new file mode 100644 index 0000000000..95fa5cf251 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_07.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_08.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_08.webp new file mode 100644 index 0000000000..99044e15f1 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_08.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_09.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_09.webp new file mode 100644 index 0000000000..a7d1729386 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_09.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_10.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_10.webp new file mode 100644 index 0000000000..e6c5bd1fc6 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_10.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_11.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_11.webp new file mode 100644 index 0000000000..6b3bbaa6d1 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_11.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_12.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_12.webp new file mode 100644 index 0000000000..4ae1887841 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_12.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_13.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_13.webp new file mode 100644 index 0000000000..51ad32bee3 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_13.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_14.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_14.webp new file mode 100644 index 0000000000..c7792e61f1 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_14.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_15.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_15.webp new file mode 100644 index 0000000000..85bad67894 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_15.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_16.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_16.webp new file mode 100644 index 0000000000..11c592c273 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_16.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_17.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_17.webp new file mode 100644 index 0000000000..95544019e8 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_17.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_18.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_18.webp new file mode 100644 index 0000000000..2b885a14b7 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_18.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_19.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_19.webp new file mode 100644 index 0000000000..3469bf2478 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_19.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_20.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_20.webp new file mode 100644 index 0000000000..c2f7d5a4a2 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_20.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_21.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_21.webp new file mode 100644 index 0000000000..65f189690c Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_21.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_22.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_22.webp new file mode 100644 index 0000000000..d44939270a Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_22.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_23.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_23.webp new file mode 100644 index 0000000000..fe419028d4 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_23.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_24.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_24.webp new file mode 100644 index 0000000000..3270c5821f Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_24.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_25.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_25.webp new file mode 100644 index 0000000000..5f4994c754 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_25.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_26.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_26.webp new file mode 100644 index 0000000000..54416a4074 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_26.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_27.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_27.webp new file mode 100644 index 0000000000..bbb6ea0e9c Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_27.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_28.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_28.webp new file mode 100644 index 0000000000..3ce4ee4fdb Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_28.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_29.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_29.webp new file mode 100644 index 0000000000..e2bd5f4d53 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_29.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_30.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_30.webp new file mode 100644 index 0000000000..974bf4220b Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_30.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_31.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_31.webp new file mode 100644 index 0000000000..1abaa76470 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_31.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_32.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_32.webp new file mode 100644 index 0000000000..fcf2731522 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_32.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_33.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_33.webp new file mode 100644 index 0000000000..b19471408e Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_33.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_34.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_34.webp new file mode 100644 index 0000000000..1f7713a093 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_34.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_35.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_35.webp new file mode 100644 index 0000000000..81cb5afbd3 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_35.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_36.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_36.webp new file mode 100644 index 0000000000..418c6ef9ff Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_36.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_37.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_37.webp new file mode 100644 index 0000000000..fc392eab69 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_37.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_38.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_38.webp new file mode 100644 index 0000000000..40b3c23b14 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_38.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_39.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_39.webp new file mode 100644 index 0000000000..ea6cca0bd5 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_39.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_40.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_40.webp new file mode 100644 index 0000000000..131f994fc6 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_40.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_41.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_41.webp new file mode 100644 index 0000000000..b55ac88773 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_41.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_42.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_42.webp new file mode 100644 index 0000000000..4e2c17b954 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_42.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_43.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_43.webp new file mode 100644 index 0000000000..c632e6ce0d Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_43.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_44.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_44.webp new file mode 100644 index 0000000000..fc98ef6513 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_44.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_45.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_45.webp new file mode 100644 index 0000000000..81bf8998f2 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_45.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_46.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_46.webp new file mode 100644 index 0000000000..5765c4c053 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_46.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_47.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_47.webp new file mode 100644 index 0000000000..7aec6022bd Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_47.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_48.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_48.webp new file mode 100644 index 0000000000..f1de312084 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_48.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_49.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_49.webp new file mode 100644 index 0000000000..c699556317 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_49.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_50.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_50.webp new file mode 100644 index 0000000000..4217782cd7 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_50.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_51.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_51.webp new file mode 100644 index 0000000000..b0f0755168 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_51.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_52.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_52.webp new file mode 100644 index 0000000000..8ec255126d Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_52.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_53.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_53.webp new file mode 100644 index 0000000000..c07fc56bc5 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_53.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_54.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_54.webp new file mode 100644 index 0000000000..7b32e3b69d Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_54.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_55.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_55.webp new file mode 100644 index 0000000000..8c57531000 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_55.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_56.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_56.webp new file mode 100644 index 0000000000..617a637c48 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_56.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_57.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_57.webp new file mode 100644 index 0000000000..9939227685 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_57.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_58.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_58.webp new file mode 100644 index 0000000000..d8537918f8 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_58.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_59.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_59.webp new file mode 100644 index 0000000000..93eadcf531 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_59.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_60.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_60.webp new file mode 100644 index 0000000000..abe3e84f8a Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_60.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_61.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_61.webp new file mode 100644 index 0000000000..382fe141df Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_61.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_62.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_62.webp new file mode 100644 index 0000000000..dff5c24b55 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_62.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_63.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_63.webp new file mode 100644 index 0000000000..729d3efb66 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_63.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_64.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_64.webp new file mode 100644 index 0000000000..f0d689b069 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_64.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_65.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_65.webp new file mode 100644 index 0000000000..e035435642 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_65.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_66.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_66.webp new file mode 100644 index 0000000000..746500b7ff Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_66.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_67.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_67.webp new file mode 100644 index 0000000000..6352900bca Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_67.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_68.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_68.webp new file mode 100644 index 0000000000..46caa69376 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_68.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_69.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_69.webp new file mode 100644 index 0000000000..cd446ce528 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_69.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_70.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_70.webp new file mode 100644 index 0000000000..f3e431ec10 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_70.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_71.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_71.webp new file mode 100644 index 0000000000..0a27b49156 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_71.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_72.webp b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_72.webp new file mode 100644 index 0000000000..9389f192b7 Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-nodpi/charter_p_xiaozhi_normal_72.webp differ diff --git a/OCH/mogo-och-common-module/src/main/res/layout/activity_video_player.xml b/OCH/mogo-och-common-module/src/main/res/layout/activity_video_player.xml index 4af9cb07d9..6a04f38ead 100644 --- a/OCH/mogo-och-common-module/src/main/res/layout/activity_video_player.xml +++ b/OCH/mogo-och-common-module/src/main/res/layout/activity_video_player.xml @@ -4,8 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/road_video_bg" - tools:context="com.mogo.eagle.core.function.main.VideoAdAtc"> + android:background="@drawable/road_video_bg"> + + + @drawable/charter_p_xiaozhi_normal_00 + @drawable/charter_p_xiaozhi_normal_01 + @drawable/charter_p_xiaozhi_normal_02 + @drawable/charter_p_xiaozhi_normal_03 + @drawable/charter_p_xiaozhi_normal_04 + @drawable/charter_p_xiaozhi_normal_05 + @drawable/charter_p_xiaozhi_normal_06 + @drawable/charter_p_xiaozhi_normal_07 + @drawable/charter_p_xiaozhi_normal_08 + @drawable/charter_p_xiaozhi_normal_09 + @drawable/charter_p_xiaozhi_normal_10 + @drawable/charter_p_xiaozhi_normal_11 + @drawable/charter_p_xiaozhi_normal_12 + @drawable/charter_p_xiaozhi_normal_13 + @drawable/charter_p_xiaozhi_normal_14 + @drawable/charter_p_xiaozhi_normal_15 + @drawable/charter_p_xiaozhi_normal_16 + @drawable/charter_p_xiaozhi_normal_17 + @drawable/charter_p_xiaozhi_normal_18 + @drawable/charter_p_xiaozhi_normal_19 + @drawable/charter_p_xiaozhi_normal_20 + @drawable/charter_p_xiaozhi_normal_21 + @drawable/charter_p_xiaozhi_normal_22 + @drawable/charter_p_xiaozhi_normal_23 + @drawable/charter_p_xiaozhi_normal_24 + @drawable/charter_p_xiaozhi_normal_25 + @drawable/charter_p_xiaozhi_normal_26 + @drawable/charter_p_xiaozhi_normal_27 + @drawable/charter_p_xiaozhi_normal_28 + @drawable/charter_p_xiaozhi_normal_29 + @drawable/charter_p_xiaozhi_normal_30 + @drawable/charter_p_xiaozhi_normal_31 + @drawable/charter_p_xiaozhi_normal_32 + @drawable/charter_p_xiaozhi_normal_33 + @drawable/charter_p_xiaozhi_normal_34 + @drawable/charter_p_xiaozhi_normal_35 + @drawable/charter_p_xiaozhi_normal_36 + @drawable/charter_p_xiaozhi_normal_37 + @drawable/charter_p_xiaozhi_normal_38 + @drawable/charter_p_xiaozhi_normal_39 + @drawable/charter_p_xiaozhi_normal_40 + @drawable/charter_p_xiaozhi_normal_41 + @drawable/charter_p_xiaozhi_normal_42 + @drawable/charter_p_xiaozhi_normal_43 + @drawable/charter_p_xiaozhi_normal_44 + @drawable/charter_p_xiaozhi_normal_45 + @drawable/charter_p_xiaozhi_normal_46 + @drawable/charter_p_xiaozhi_normal_47 + @drawable/charter_p_xiaozhi_normal_48 + @drawable/charter_p_xiaozhi_normal_49 + @drawable/charter_p_xiaozhi_normal_50 + @drawable/charter_p_xiaozhi_normal_51 + @drawable/charter_p_xiaozhi_normal_52 + @drawable/charter_p_xiaozhi_normal_53 + @drawable/charter_p_xiaozhi_normal_54 + @drawable/charter_p_xiaozhi_normal_55 + @drawable/charter_p_xiaozhi_normal_56 + @drawable/charter_p_xiaozhi_normal_57 + @drawable/charter_p_xiaozhi_normal_58 + @drawable/charter_p_xiaozhi_normal_59 + @drawable/charter_p_xiaozhi_normal_60 + @drawable/charter_p_xiaozhi_normal_61 + @drawable/charter_p_xiaozhi_normal_62 + @drawable/charter_p_xiaozhi_normal_63 + @drawable/charter_p_xiaozhi_normal_64 + @drawable/charter_p_xiaozhi_normal_65 + @drawable/charter_p_xiaozhi_normal_66 + @drawable/charter_p_xiaozhi_normal_67 + @drawable/charter_p_xiaozhi_normal_68 + @drawable/charter_p_xiaozhi_normal_69 + @drawable/charter_p_xiaozhi_normal_70 + @drawable/charter_p_xiaozhi_normal_71 + @drawable/charter_p_xiaozhi_normal_72 + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/attrs.xml b/OCH/mogo-och-common-module/src/main/res/values/attrs.xml index 9043a1d2ad..596cd32cc6 100644 --- a/OCH/mogo-och-common-module/src/main/res/values/attrs.xml +++ b/OCH/mogo-och-common-module/src/main/res/values/attrs.xml @@ -47,7 +47,7 @@ - + diff --git a/OCH/mogo-och-data/src/androidTest/java/com/mogo/och/data/ExampleInstrumentedTest.kt b/OCH/mogo-och-data/src/androidTest/java/com/mogo/och/data/ExampleInstrumentedTest.kt deleted file mode 100644 index 673a5dcfd3..0000000000 --- a/OCH/mogo-och-data/src/androidTest/java/com/mogo/och/data/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.mogo.och.data - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.mogo.och.data.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/OCH/mogo-och-data/src/test/java/com/mogo/och/data/ExampleUnitTest.kt b/OCH/mogo-och-data/src/test/java/com/mogo/och/data/ExampleUnitTest.kt deleted file mode 100644 index 294d55ae21..0000000000 --- a/OCH/mogo-och-data/src/test/java/com/mogo/och/data/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.mogo.och.data - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/OCH/mogo-och-noop/src/main/AndroidManifest.xml b/OCH/mogo-och-noop/src/main/AndroidManifest.xml index a76961473f..35d80bdbc7 100644 --- a/OCH/mogo-och-noop/src/main/AndroidManifest.xml +++ b/OCH/mogo-och-noop/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - + + \ No newline at end of file diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index d864c3f82e..102935f344 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -22,20 +22,23 @@ import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener; +import com.mogo.eagle.core.data.config.HdMapBuildConfig; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView; import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView; import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView; import com.mogo.eagle.core.function.hmi.ui.widget.TrafficDataView; import com.mogo.eagle.core.function.smp.view.SmallMapView; import com.mogo.eagle.core.function.view.MapBizView; +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.MogoMap; import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.listener.MogoMapListenerHandler; import com.mogo.map.uicontroller.IMogoMapUIController; @@ -62,7 +65,7 @@ import record_cache.RecordPanelOuterClass; * * @author tongchenfei */ -public abstract class BaseBusTabFragment> extends MvpFragment implements IMogoMapListener, IMoGoAutopilotRecordListener { +public abstract class BaseBusTabFragment> extends MvpFragment implements IMogoMapListener { private static final String TAG = "BaseBusTabFragment"; @@ -209,7 +212,6 @@ public abstract class BaseBusTabFragment if (mBadcaseBtn != null) { CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn); - CallerAutopilotRecordListenerManager.INSTANCE.addListener(TAG, this); } mAICollectBtn = findViewById(R.id.module_mogo_och_ai_collet_rl); @@ -261,6 +263,17 @@ public abstract class BaseBusTabFragment protected abstract void onArriveStation(); private void updateSwitchMapIcon() { + + IMogoMapUIController mapUIController = CallerMapUIServiceManager.INSTANCE.getMapUIController(MogoMap.DEFAULT); + if(mapUIController!=null){ + if (AppIdentityModeUtils.isM2(FunctionBuildConfig.appIdentityMode)) { + mapUIController.changeCurrentIcon(R.raw.m2); + HdMapBuildConfig.currentCarVrIconRes = R.raw.m2; + }else if (AppIdentityModeUtils.isJL(FunctionBuildConfig.appIdentityMode)) { + mapUIController.changeCurrentIcon(R.raw.xiaoba); + HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaoba; + } + } if(mapBizView != null){ IMogoMapUIController uiController = mapBizView.getUI(); if(uiController != null){ @@ -306,18 +319,6 @@ public abstract class BaseBusTabFragment EventBus.getDefault().unregister(this); } - @Override - public void onAutopilotRecordResult(@Nullable RecordPanelOuterClass.RecordPanel recordPanel) { - } - - @Override - public void onAutopilotRecordConfig(@NonNull MessagePad.RecordDataConfig config) { - } - - @Override - public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) { - } - /** * 测试到站 */ diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java index 1571739e3b..71e18d6523 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java @@ -28,10 +28,10 @@ public class OpenItemAnimator extends DefaultItemAnimator { private static TimeInterpolator sDefaultInterpolator; - private ArrayList mPendingRemovals = new ArrayList<>(); - private ArrayList mPendingAdditions = new ArrayList<>(); - private ArrayList mPendingMoves = new ArrayList<>(); - private ArrayList mPendingChanges = new ArrayList<>(); + private final ArrayList mPendingRemovals = new ArrayList<>(); + private final ArrayList mPendingAdditions = new ArrayList<>(); + private final ArrayList mPendingMoves = new ArrayList<>(); + private final ArrayList mPendingChanges = new ArrayList<>(); ArrayList> mAdditionsList = new ArrayList<>(); ArrayList> mMovesList = new ArrayList<>(); @@ -102,20 +102,16 @@ public class OpenItemAnimator extends DefaultItemAnimator { mPendingRemovals.clear(); // Next, move stuff if (movesPending) { - final ArrayList moves = new ArrayList<>(); - moves.addAll(mPendingMoves); + final ArrayList moves = new ArrayList<>(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); + Runnable mover = () -> { + for (MoveInfo moveInfo : moves) { + animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY, + moveInfo.toX, moveInfo.toY); } + moves.clear(); + mMovesList.remove(moves); }; if (removalsPending) { View view = moves.get(0).holder.itemView; @@ -126,19 +122,15 @@ public class OpenItemAnimator extends DefaultItemAnimator { } // Next, change stuff, to run in parallel with move animations if (changesPending) { - final ArrayList changes = new ArrayList<>(); - changes.addAll(mPendingChanges); + final ArrayList changes = new ArrayList<>(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); + Runnable changer = () -> { + for (ChangeInfo change : changes) { + animateChangeImpl(change); } + changes.clear(); + mChangesList.remove(changes); }; if (removalsPending) { RecyclerView.ViewHolder holder = changes.get(0).oldHolder; @@ -149,19 +141,15 @@ public class OpenItemAnimator extends DefaultItemAnimator { } // Next, add stuff if (additionsPending) { - final ArrayList additions = new ArrayList<>(); - additions.addAll(mPendingAdditions); + final ArrayList additions = new ArrayList<>(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); + Runnable adder = () -> { + for (RecyclerView.ViewHolder holder : additions) { + animateAddImpl(holder); } + additions.clear(); + mAdditionsList.remove(additions); }; if (removalsPending || movesPending || changesPending) { long removeDuration = removalsPending ? getRemoveDuration() : 0; @@ -341,8 +329,8 @@ public class OpenItemAnimator extends DefaultItemAnimator { final ViewPropertyAnimator oldViewAnim = view.animate().setDuration( getChangeDuration()); mChangeAnimations.add(changeInfo.oldHolder); - oldViewAnim.translationX(changeInfo.toX - changeInfo.fromX); - oldViewAnim.translationY(changeInfo.toY - changeInfo.fromY); + oldViewAnim.translationX((float)(changeInfo.toX - changeInfo.fromX)); + oldViewAnim.translationY((float)(changeInfo.toY - changeInfo.fromY)); oldViewAnim.alpha(0).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animator) { diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/view/BusArcView.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/view/BusArcView.java index a9e7bdff5d..5be7429728 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/view/BusArcView.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/view/BusArcView.java @@ -75,13 +75,13 @@ public class BusArcView extends View { mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); //绘制中心的数值 mTextPaint.getTextBounds(mValue, 0, mValue.length(), mRect); - canvas.drawText(mValue, getWidth() / 2, getHeight() / 2 + mRect.height() / 2 - 10, mTextPaint); + canvas.drawText(mValue, getWidth() / 2.0f, getHeight() / 2.0f + mRect.height() / 2.0f - 10, mTextPaint); mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); //绘制中心文字描述 mTextPaint.setTextSize(getResources().getDimension(R.dimen.bus_ext_arcView_des_text_size)); mTextPaint.getTextBounds(mDes, 0, mDes.length(), mRect); - canvas.drawText(mDes, getWidth() / 2, getHeight() * 17 / 20 + mRect.height() / 2, mTextPaint); + canvas.drawText(mDes, getWidth() / 2.0f, getHeight() * 17.0f / 20.0f + mRect.height() / 2.0f, mTextPaint); } private void drawArc(Canvas canvas) { @@ -135,13 +135,10 @@ public class BusArcView extends View { ValueAnimator progressAnimator = ValueAnimator.ofFloat(startAngle, currentAngle); progressAnimator.setDuration(time); progressAnimator.setTarget(mIncludedAngle); - progressAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - mIncludedAngle = (float) animation.getAnimatedValue(); - //重新绘制,不然不会出现效果 - postInvalidate(); - } + progressAnimator.addUpdateListener(animation -> { + mIncludedAngle = (float) animation.getAnimatedValue(); + //重新绘制,不然不会出现效果 + postInvalidate(); }); //开始执行动画 progressAnimator.start(); diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java index f04edddbdb..bcb895c955 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java @@ -22,7 +22,6 @@ import android.view.animation.DecelerateInterpolator; import androidx.annotation.Nullable; import com.mogo.commons.AbsMogoApplication; -import com.mogo.eagle.core.utilcode.util.BitmapHelper; import com.mogo.och.bus.R; import me.jessyan.autosize.AutoSizeConfig; @@ -92,7 +91,7 @@ public class SlidePanelView extends View { private ObjectAnimator matrixAnim; private String blockText = STRING_SLIDE_TO_RIGHT; - private Paint.FontMetrics blockTextMetrics = new Paint.FontMetrics(); + private final Paint.FontMetrics blockTextMetrics = new Paint.FontMetrics(); private static final int GRADIENT_OFFSET = 200; @@ -263,10 +262,10 @@ public class SlidePanelView extends View { gradientMatrix.setTranslate(matrixTranslate, 0); textGradient.setLocalMatrix(gradientMatrix); canvas.save(); - canvas.drawText(blockText, blockWidth + BLOCK_START_X + textMarginLeft, textOffset, textPaint); + canvas.drawText(blockText, (float) (blockWidth + BLOCK_START_X + textMarginLeft), (float) textOffset, textPaint); canvas.restore(); // 画滑块 - canvas.drawBitmap(bmBlock, BLOCK_START_X + blockOffset, BLOCK_START_Y, blockPaint); + canvas.drawBitmap(bmBlock, (float) (BLOCK_START_X + blockOffset), (float) BLOCK_START_Y, blockPaint); } public interface OnSlidePanelMoveToEndListener { diff --git a/OCH/shuttle/passenger/build.gradle b/OCH/shuttle/passenger/build.gradle index fc31c43627..e10e559cf5 100644 --- a/OCH/shuttle/passenger/build.gradle +++ b/OCH/shuttle/passenger/build.gradle @@ -74,7 +74,9 @@ dependencies { implementation project(":OCH:mogo-och-common-module") compileOnly project(":libraries:mogo-map") implementation project(':core:mogo-core-res') - testImplementation 'junit:junit:4.12' + + androidTestImplementation rootProject.ext.dependencies.androidxjunit + testImplementation rootProject.ext.dependencies.junit } diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java index 786264650f..8d8c4b0453 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java @@ -10,7 +10,6 @@ import mogo.telematics.pad.MessagePad; * Created on 2022/3/31 */ public interface IBusPassengerAutopilotPlanningCallback { - void routeResult(List models,int haveArrivedIndex); void routePlanningToNextStationChanged(long meters, long timeInSecond); void updateTotalDistance(); } diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java index 44758ad03c..28f8a23303 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java @@ -13,7 +13,7 @@ import android.os.Message; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.amap.api.maps.model.LatLng; + import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.module.intent.IMogoIntentListener; @@ -34,10 +34,11 @@ import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResponse; import com.mogo.och.common.module.bean.dpmsg.AppConnectMsg; import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg; import com.mogo.och.common.module.bean.dpmsg.DPMsgType; -import com.mogo.och.common.module.bean.dpmsg.LoginCacheStatus; import com.mogo.och.common.module.bean.dpmsg.TaskDetailsMsg; import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager; import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.manager.distancemamager.IDistanceListener; +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager; import com.mogo.och.common.module.utils.DateTimeUtil; import com.mogo.commons.module.status.StatusDescriptor; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; @@ -49,11 +50,9 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager; -import com.mogo.eagle.core.network.utils.GsonUtil; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; -import com.mogo.eagle.core.utilcode.util.CoordinateUtils; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.och.bus.passenger.callback.IBusPassegerDriverStatusCallback; import com.mogo.och.bus.passenger.callback.IBusPassengerADASStatusCallback; @@ -151,14 +150,6 @@ public class BusPassengerModel { sendMsgToServer(GsonUtils.toJson(msg)); } - private void queryLoginStatusByLocal() { - //本地去请求司机端 - LoginCacheStatus msg = new LoginCacheStatus(0, - DPMsgType.TYPE_LOGIN_STATUS.getType()); - - sendMsgToServer(GsonUtils.toJson(msg)); - } - public void setDriverStatusCallback(IBusPassegerDriverStatusCallback callback){ this.mDriverStatusCallback = callback; } @@ -255,7 +246,7 @@ public class BusPassengerModel { } if (code == 1003){ routesResult = null; - startOrStopCalculateRouteInfo(false); + cleanStation("queryDriverSiteByCoordinate 1003"); return; } queryDriverByLocalDriver(); @@ -268,7 +259,7 @@ public class BusPassengerModel { routesResult = null; } mNextStationIndex = 0; - startOrStopCalculateRouteInfo(false); + cleanStation("queryDriverSiteByCoordinate"); mRoutePoints.clear(); if (mRouteLineInfoCallback != null){ mRouteLineInfoCallback.showNoTaskView(); @@ -298,19 +289,20 @@ public class BusPassengerModel { mRouteLineInfoCallback.updateStationsInfo(stations,i+1,false); if(mNextStationIndex != i+1){ mTwoStationsRouts.clear(); - startRemainRouteInfo(); } mNextStationIndex = i+1; + BusStationBean startStation = mStations.get(i); + BusStationBean endStation = mStations.get(i+1); + setTrajectoryStation(startStation, endStation, result.getLineId()); return; }else if (station.getDrivingStatus() == STATION_STATUS_STOPPED && !station.isLeaving()){ - if (i == 0){ - startOrStopRouteAndWipe(false); + if (i == stations.size() - 1) { + cleanStation("updatePassengerRouteInfo最后一个站点"); } isGoingToNextStation = false; Logger.d(M_BUS_P + TAG, "order = station= arrive"); mPreRouteIndex = 0; - startOrStopCalculateRouteInfo(false); mRouteLineInfoCallback.updateStationsInfo(stations,i,true); return; } @@ -322,7 +314,7 @@ public class BusPassengerModel { public void release() { releaseListeners(); - startOrStopCalculateRouteInfo(false); + cleanStation("release"); startOrStopOrderLoop(false); } @@ -363,6 +355,7 @@ public class BusPassengerModel { CallerTelematicListenerManager.INSTANCE.addListener(TAG,mReceivedMsgListener); AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext); + TrajectoryAndDistanceManager.INSTANCE.addDistanceListener(TAG, trajectoryListener); } private void releaseListeners() { @@ -383,6 +376,28 @@ public class BusPassengerModel { CallerTelematicListenerManager.INSTANCE.removeListener(TAG); } + private final IDistanceListener trajectoryListener = new IDistanceListener() { + @Override + public void stationDistanceCallback(float distance) { + + } + @Override + public void distanceCallback(float distance) { + double lastTime = distance / BusPassengerConst.BUS_AVERAGE_SPEED * 3.6; //秒 + CallerLogger.d(M_BUS_P + TAG, "轨迹排查==lastSumLength = "+distance); + if(routesResult!=null){ + for (BusStationBean site : routesResult.getSites()) { + if (site.getDrivingStatus() == BusPassengerConst.STATION_STATUS_STOPPED && !site.isLeaving()) { + return; + } + } + } + mAutopilotPlanningCallback.routePlanningToNextStationChanged( + (long)distance, (long)lastTime + ); + } + }; + private final IReceivedMsgListener mReceivedMsgListener = new IReceivedMsgListener() { @Override public void onReceivedServerSn(@Nullable String sn) { @@ -493,7 +508,6 @@ public class BusPassengerModel { @Override public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - if (autopilotStatusInfo == null) return; int state = autopilotStatusInfo.getState(); if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { //2022.7.20 自动驾驶更换成带档位的 @@ -553,8 +567,8 @@ public class BusPassengerModel { @Override public synchronized void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { - CallerLogger.d(M_BUS_P + TAG, "onAutopilotRotting = " - + GsonUtil.jsonFromObject(routeList)); +// CallerLogger.d(M_BUS_P + TAG, "onAutopilotRotting = " +// + GsonUtil.jsonFromObject(routeList)); List routePoints = routeList.getWayPointsList(); if(globalPathTruncation!=null&&!globalPathTruncation.isDisposed()){ @@ -569,7 +583,6 @@ public class BusPassengerModel { CallerLogger.d(M_BUS_P + TAG, "接受轨迹中"); if (null != routePoints && routePoints.size() > 0){ updateRoutePoints(routePoints); - startToRouteAndWipe(); } } }; @@ -620,108 +633,12 @@ public class BusPassengerModel { } } - public void dynamicCalculateRouteInfo() { - //计算当前位置和下一站的剩余点集合 - //计算剩余点总里程和时间 - CallerLogger.d(M_BUS_P + TAG, "轨迹排查==mTwoStationsRouts.size() = " + mTwoStationsRouts.size()); - if (mTwoStationsRouts.size() == 0){ - calculateTwoStationsRoute(); - } - if (mTwoStationsRouts.size() > 0 && mLocation != null){ - Map> lastPointsMap = CoordinateCalculateRouteUtil - .getRemainPointListByCompareNew(mPreRouteIndex,mTwoStationsRouts,mLocation); - if(lastPointsMap==null){ - return; - } - for (int index: lastPointsMap.keySet()) { - mPreRouteIndex = index; - break; - } - - for (List lastPoints: lastPointsMap.values()){ - CallerLogger.d(M_BUS_P + TAG, "轨迹排查==lastPoints.size() = " + lastPoints.size()); - float lastSumLength = 0; - if (lastPoints.size() == 1){ //只是最后一个点,计算当前位置和最后一个点的距离 - if (mNextStationIndex <= mStations.size()-1 && mNextStationIndex >= 0){ - BusStationBean stationNext = mStations.get(mNextStationIndex); - lastSumLength = CoordinateUtils.calculateLineDistance( - stationNext.getGcjLon(), stationNext.getGcjLat(), - mLocation.getLongitude(), mLocation.getLatitude()); - }else { - lastSumLength = CoordinateUtils.calculateLineDistance( - lastPoints.get(0).getLongitude(), lastPoints.get(0).getLatitude(), - mLocation.getLongitude(), mLocation.getLatitude()); - } - - }else { - lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints); - } - - double lastTime = lastSumLength / getAverageSpeed() * 3.6 ; //秒 - CallerLogger.d(M_BUS_P + TAG, "轨迹排查==lastSumLength = " + lastSumLength); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.routePlanningToNextStationChanged((long)lastSumLength,(long) lastTime); - } - } - } - } - public int getAverageSpeed(){ return BusPassengerConst.SHUTTLE_AVERAGE_SPEED; } - public void startRemainRouteInfo() { - //开启实时计算剩余距离,剩余时间,预计时间 - startOrStopCalculateRouteInfo(true); - } - - public void startToRouteAndWipe() { - startOrStopRouteAndWipe(true); - } - - /** - * 实时轨迹擦除 - * @param isStart - */ - public void startOrStopRouteAndWipe(boolean isStart){ - if (isStart){ - BusPassengerModelLoopManager.getInstance().startOrStopRouteAndWipe(); - }else { - mWipePreIndex = 0; - BusPassengerModelLoopManager.getInstance().stopOrStopRouteAndWipe(); - } - } - public void loopRouteAndWipe() { - if (mRoutePoints != null && mRoutePoints.size() > 0 && mLocation != null){ - int haveArrivedIndex = CoordinateCalculateRouteUtil - .getArrivedPointIndexNew(mWipePreIndex, - mRoutePoints, - mLocation); - mWipePreIndex = haveArrivedIndex; - - CallerLogger.d(M_BUS_P + TAG, "thread = "+ Thread.currentThread().getName()+" haveArrivedIndex== " + haveArrivedIndex); - if (mAutopilotPlanningCallback != null){ - List routePoints = CoordinateCalculateRouteUtil - .coordinateConverterLocationToLatLng(mContext,mRoutePoints); - mAutopilotPlanningCallback.routeResult(routePoints,haveArrivedIndex); - } - } - } - - /** - * 开始轮询计算剩余里程和时间 - * @param isStart - */ - public void startOrStopCalculateRouteInfo(boolean isStart) { - CallerLogger.d(M_BUS_P + TAG, "startOrStopCalculateRouteInfo() " + isStart); - if (isStart) { - BusPassengerModelLoopManager.getInstance().startCalculateRouteInfoLoop(); - } else { - mTwoStationsRouts.clear(); - BusPassengerModelLoopManager.getInstance().stopCalculateRouteInfLoop(); - } } private void startOrStopOrderLoop(boolean start) { @@ -733,4 +650,23 @@ public class BusPassengerModel { } } + private void setTrajectoryStation( + BusStationBean startStationInfo , + BusStationBean endStationInfo, + int lineId + ) { + MogoLocation startStation = new MogoLocation(); + startStation.setLongitude(startStationInfo.getGcjLon()); + startStation.setLatitude(startStationInfo.getGcjLat()); + MogoLocation endStation = new MogoLocation(); + endStation.setLongitude(endStationInfo.getGcjLon()); + endStation.setLatitude(endStationInfo.getGcjLat()); + TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStation, endStation, (long)lineId); + } + + private void cleanStation(String type) { + CallerLogger.d(M_BUS_P + TAG, "清理站点:"+type); + TrajectoryAndDistanceManager.INSTANCE.setStationPoint(null, null, -1L); + } + } diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java index 3c3db7fd66..6f9c029f3b 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java @@ -6,18 +6,14 @@ import com.mogo.och.bus.passenger.model.BusPassengerModel; import java.util.concurrent.TimeUnit; import io.reactivex.Observable; -import io.reactivex.ObservableEmitter; -import io.reactivex.ObservableOnSubscribe; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; import static com.mogo.och.bus.passenger.constant.BusPassengerConst.LOOP_DELAY; import static com.mogo.och.bus.passenger.constant.BusPassengerConst.LOOP_LINE_2S; -import static com.mogo.och.bus.passenger.constant.BusPassengerConst.LOOP_LINE_1S; /** * Created on 2021/11/22 @@ -40,43 +36,6 @@ public class BusPassengerModelLoopManager { private CompositeDisposable mRouteWipeDisposable; private CompositeDisposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间 - public void startOrStopRouteAndWipe() { - CallerLogger.i(M_BUS_P + TAG, "startOrStopRouteWipe()"); - if (mRouteWipeDisposable != null) return; - if (mRouteWipeDisposable == null){ - mRouteWipeDisposable = new CompositeDisposable(); - } - Disposable disposable = startLoopRouteAndWipe() - .doOnSubscribe(new Consumer() { - @Override - public void accept(Disposable disposable) throws Exception { - } - }) - .doOnError(new Consumer() { - @Override - public void accept(Throwable throwable) throws Exception { - } - }) - .delay(LOOP_LINE_1S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 - .subscribeOn(Schedulers.io()) - .repeat() // repeat保证请求成功后能够重新订阅。 - .retry() // retry保证请求失败后能重新订阅 - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(Integer integer) throws Exception { - } - }); - mRouteWipeDisposable.add(disposable); - } - - public void stopOrStopRouteAndWipe() { - if (mRouteWipeDisposable != null) { - mRouteWipeDisposable.dispose(); - mRouteWipeDisposable = null; - } - } - public void startQueryDriverLineLoop() { if (mQueryLineDisposable != null && !mQueryLineDisposable.isDisposed()) { return; @@ -98,63 +57,4 @@ public class BusPassengerModelLoopManager { } } - public void startCalculateRouteInfoLoop() { - CallerLogger.i(M_BUS_P + TAG, "startCalculateRouteInfoLoop()"); - if (mCalculateRouteDisposable != null) return; - if (mCalculateRouteDisposable == null){ - mCalculateRouteDisposable = new CompositeDisposable(); - } - Disposable disposable = startLoopCalculateRouteInfo() - .doOnSubscribe(new Consumer() { - @Override - public void accept(Disposable disposable) throws Exception { - } - }) - .doOnError(new Consumer() { - @Override - public void accept(Throwable throwable) throws Exception { - } - }) - .delay(LOOP_LINE_2S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 - .subscribeOn(Schedulers.io()) - .repeat() // repeat保证请求成功后能够重新订阅。 - .retry() // retry保证请求失败后能重新订阅 - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(Integer integer) throws Exception { - } - }); - mCalculateRouteDisposable.add(disposable); - } - - public void stopCalculateRouteInfLoop() { - if (mCalculateRouteDisposable != null) { - CallerLogger.i(M_BUS_P + TAG, "stopCalculateRouteInfLoop()"); - mCalculateRouteDisposable.dispose(); - mCalculateRouteDisposable = null; - } - } - - private Observable startLoopRouteAndWipe(){ - return Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter emitter) throws Exception { - if (emitter.isDisposed()) return; - BusPassengerModel.getInstance().loopRouteAndWipe(); - emitter.onComplete(); - } - }); - } - - private Observable startLoopCalculateRouteInfo(){ - return Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter emitter) throws Exception { - if (emitter.isDisposed()) return; - BusPassengerModel.getInstance().dynamicCalculateRouteInfo(); - emitter.onComplete(); - } - }); - } } diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java index b6510fe011..e27d90bde7 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java @@ -7,14 +7,12 @@ import android.os.Looper; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; -import com.amap.api.maps.model.LatLng; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.data.map.MogoLocation; 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.bus.passenger.bean.BusPassengerStation; import com.mogo.och.bus.passenger.callback.IBusPassegerDriverStatusCallback; import com.mogo.och.bus.passenger.callback.IBusPassengerADASStatusCallback; import com.mogo.och.bus.passenger.callback.IBusPassengerAutopilotPlanningCallback; @@ -146,13 +144,6 @@ public class BaseBusPassengerPresenter extends Presenter mView.hideNoTaskView()); } - @Override - public void routeResult(List models, int haveArrivedIndex) { - CallerLogger.d(M_BUS_P + TAG, "routeResult:" + models.size() - + " haveArrivedIndex = "+haveArrivedIndex); - runOnUIThread(() ->mView.routeResult(models,haveArrivedIndex)); - } - @Override public void routePlanningToNextStationChanged(long meters, long timeInSecond) { runOnUIThread(() -> mView.updateRoutePlanningToNextStation(meters, timeInSecond)); diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java index 8685f237c3..8f5bfed4cd 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java @@ -58,7 +58,7 @@ public abstract class BusPassengerBaseFragment mCoordinatesLatLng = new ArrayList<>(); //轨迹坐标数据 - private List mLineStationLatLng = new ArrayList<>();//站点坐标数据 - private Polyline mPolyline; - private CameraUpdate mCameraUpdate; - private Context mContext; - - List textureList = new ArrayList<>(); - List texIndexList = new ArrayList<>(); - private int mHaveArrivedIndex = 0; - - private List mLineMarkers = new ArrayList<>(); - -// private IBusPassengerMapViewCallback mIBusPassengerMapViewCallback; - private BitmapDescriptor mArrivedRes; - private BitmapDescriptor mUnArrivedRes; - - public BusPassengerMapDirectionView(Context context) { - this(context, null); - } - - public BusPassengerMapDirectionView(Context context, @Nullable AttributeSet attrs) { - this(context, attrs, 0); - } - - public BusPassengerMapDirectionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - try { - initView(context); - } catch (Exception e) { - e.printStackTrace(); - } - } - -// public void setTaxiPassengerMapViewCallback(IBusPassengerMapViewCallback iBusPassengerMapViewCallback) { -// this.mIBusPassengerMapViewCallback = iBusPassengerMapViewCallback; -// } - - private void initView(Context context) { - CallerLogger.d(M_BUS_P + TAG, "initView"); - - mContext = context; - - View smpView = LayoutInflater.from(context).inflate(R.layout.bus_p_map_view, this); - - mAMapNaviView = (TextureMapView) smpView.findViewById(R.id.bus_p_line_amap_view); - - initAMapView(); - - // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, 10,this); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); - } - - private void initAMapView() { -// mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel); - mAMap = mAMapNaviView.getMap(); - // 设置导航地图模式,aMap是地图控制器对象。 - mAMap.setMapType(AMap.MAP_TYPE_NIGHT); - - // 关闭显示实时路况图层,aMap是地图控制器对象。 - mAMap.setTrafficEnabled(false); - - // 设置 锚点 图标 - mCarMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_car)) - .anchor(0.5f, 0.5f)); - - mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_arrived); - mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_un_arrive); - - // 加载自定义样式 - CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions() - .setEnable(true) - .setStyleData(BusPassengerMapAssetStyleUtil.getAssetsStyle(getContext(), "map_style.data")) - .setStyleExtraData(BusPassengerMapAssetStyleUtil.getAssetsExtraStyle(getContext(), "map_style_extra.data")); - // 设置自定义样式 - mAMap.setCustomMapStyle(customMapStyleOptions); - - //设置希望展示的地图缩放级别 -// mAMap.moveCamera(mCameraUpdate); - - // 设置地图的样式 - UiSettings uiSettings = mAMap.getUiSettings(); - uiSettings.setZoomControlsEnabled(false);// 地图缩放级别的交换按钮 - uiSettings.setAllGesturesEnabled(false);// 所有手势 - uiSettings.setMyLocationButtonEnabled(false); // 显示默认的定位按钮 - uiSettings.setLogoBottomMargin(-150); //设置Logo下边界距离屏幕底部的边距,设置为负值即可 - - mAMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() { - @Override - public void onMapLoaded() { - CallerLogger.d(M_BUS_P + TAG, "smp---onMapLoaded"); - // 加载自定义样式 - CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions() - .setEnable(true) - .setStyleData(BusPassengerMapAssetStyleUtil.getAssetsStyle(getContext(), "map_style.data")) - .setStyleExtraData(BusPassengerMapAssetStyleUtil.getAssetsExtraStyle(getContext(), "map_style_extra.data")); - // 设置自定义样式 - mAMap.setCustomMapStyle(customMapStyleOptions); - mAMapNaviView.getMap().setPointToCenter(mAMapNaviView.getWidth() / 2, mAMapNaviView.getHeight() / 2); - } - }); - - //设置地图状态的监听接口 - mAMap.setOnCameraChangeListener(this); - } - - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - return true; - } - - @Override - public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { - if (gnssInfo == null) { - return; - } -// CallerLogger.d(M_BUS_P + TAG, "onCarLocationChanged2 :" + location.getLatitude() + ":" + location.getLongitude()); - LatLng currentLatLng = new LatLng(gnssInfo.getLatitude(), gnssInfo.getLongitude()); - - //更新车辆位置 - if (mCarMarker != null) { -// CallerLogger.d(M_BUS_P + TAG, "location.getBearing() = " + location.getBearing()); - mCarMarker.setRotateAngle((float) (360 - gnssInfo.getHeading())); - mCarMarker.setPosition(currentLatLng); - mCarMarker.setToTop(); - } - - try { - //圈定地图显示范围 - LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); - - if (mCoordinatesLatLng.size() > 0){ - //存放经纬度 - for (int i = 0; i < mCoordinatesLatLng.size(); i++) { - boundsBuilder.include(mCoordinatesLatLng.get(i)); - } - //第二个参数为四周留空宽度 - }else if (mLineStationLatLng.size() > 0){ - for (int i = 0; i< mLineStationLatLng.size();i++){ - boundsBuilder.include(mLineStationLatLng.get(i)); - } - } - - boundsBuilder.include(currentLatLng); - mAMap.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(),100,100,100,100)); - }catch (Exception e){ - - } - } - - - @Override - public void drawablePolyline() { - if (mPolyline != null) { - mPolyline.remove(); - } - if (mAMap != null) { - - addRouteColorList(); - CallerLogger.d(M_BUS_P + TAG, "mLinePointsLatLng.size() = " +mLineStationLatLng.size() - +" mCoordinatesLatLng.size()= " + mCoordinatesLatLng.size()); - if (mLineStationLatLng.size() >= 2 && mCoordinatesLatLng.size() >= 2) { - //设置线段纹理 - PolylineOptions polylineOptions = new PolylineOptions(); - polylineOptions.addAll(mCoordinatesLatLng); - polylineOptions.width(14); //线段宽度 - polylineOptions.setUseTexture(true); - polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapRound); - polylineOptions.setCustomTextureList(textureList); - polylineOptions.setCustomTextureIndex(texIndexList); -// polylineOptions.colorValues(colorList); -// polylineOptions.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow)); - - // 绘制线 - mPolyline = mAMap.addPolyline(polylineOptions); - - } - } - } - - /** - * 添加画线颜色值 - */ - private void addRouteColorList() { - textureList.clear(); - texIndexList.clear(); - for (int i = 0; i < mCoordinatesLatLng.size(); i++){ - if (i <= mHaveArrivedIndex){ - textureList.add(mArrivedRes); - }else { - textureList.add(mUnArrivedRes); - } - texIndexList.add(i); - } - } - - @Override - public void clearPolyline() { - if (mPolyline != null) { - mPolyline.remove(); - } - } - - @Override - public void setLineMarker() { - - } - - public void clearCoordinatesLatLng(){ - textureList.clear(); - texIndexList.clear(); - mCoordinatesLatLng.clear(); - mLineStationLatLng.clear(); - CallerLogger.d(M_BUS_P + TAG, " mCoordinatesLatLng.clear " ); - } - - public void onCreateView(Bundle savedInstanceState) { - if (mAMapNaviView != null) { - mAMapNaviView.onCreate(savedInstanceState); - } - } - - public void onResume() { - if (mAMapNaviView != null) { - mAMapNaviView.onResume(); - } - } - - public void onPause() { - if (mAMapNaviView != null) { - mAMapNaviView.onPause(); - } - } - - public void onDestroy() { - if (mAMapNaviView != null) { - mAMapNaviView.onDestroy(); - } - } - - public void setCoordinatesLatLng(List latLngs,int haveArrivedIndex) { - mCoordinatesLatLng.clear(); - mCoordinatesLatLng.addAll(latLngs); - mHaveArrivedIndex = haveArrivedIndex; - } - - public void clearLineMarkers(){ - for (int i =0; i< mLineMarkers.size();i++){ - mLineMarkers.get(i).setVisible(false); - mLineMarkers.get(i).remove(); - } - mLineMarkers.clear(); - } - - public void setLinePointMarkerAndDraw(List mLineStationsList, int currentIndex) { - clearLineMarkers(); - mLineStationLatLng.clear(); - mLineStationLatLng.addAll(mLineStationsList); - - if (mLineStationsList.size() > 0){ - // 起点marker, 终点marker, 过站marker, 未过站marker - - int size = mLineStationsList.size(); - - Marker mStartMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_start_point))); - Marker mEndMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_end_point))); - - mStartMarker.setPosition(mLineStationsList.get(0)); - mLineMarkers.add(0,mStartMarker); - - for (int i = 0; i < mLineStationsList.size(); i++) { - if (currentIndex <= i && i < size-1 && i > 0){ //未到达 - Marker unArrivedMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_unarrived_point))); - unArrivedMarker.setPosition(mLineStationsList.get(i)); - mLineMarkers.add(i,unArrivedMarker); - }else if (i < currentIndex && i > 0){ - Marker arrivedMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrived_point))); - arrivedMarker.setPosition(mLineStationsList.get(i)); - mLineMarkers.add(i,arrivedMarker); - } - } - - mEndMarker.setPosition(mLineStationsList.get(size-1)); - mLineMarkers.add(size-1,mEndMarker); - } - } - - @Override - public void onCameraChange(CameraPosition cameraPosition) { -// mIBusPassengerMapViewCallback.onCameraChange(cameraPosition.bearing); - } - - @Override - public void onCameraChangeFinish(CameraPosition cameraPosition) { - - } -} diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java index e9ec5996d3..2f132a90b1 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java @@ -24,6 +24,7 @@ import com.mogo.och.bus.passenger.adapter.BusPassengerLineStationsAdapter; import com.mogo.och.bus.passenger.constant.BusPassengerConst; import com.mogo.och.bus.passenger.presenter.BaseBusPassengerPresenter; import com.mogo.och.bus.passenger.ui.layoutmanager.CenterLayoutManager; +import com.mogo.och.bus.passenger.ui.mapdirectionview.BusPassengerMapDirectionView; import com.mogo.och.bus.passenger.utils.BPRouteDataTestUtils; import com.mogo.och.common.module.utils.NumberFormatUtil; import com.mogo.och.common.module.wigets.MarqueeTextView; @@ -151,38 +152,13 @@ public class BusPassengerRouteFragment extends } } - public void routeResult(List latLngList,int haveArrivedIndex) { - if (latLngList.size() > 0) { - drawablePolyline(latLngList,haveArrivedIndex); - } else { - clearMapView(); - } - } - - /** - * 绘制 - * - * @param coordinates - */ - private void drawablePolyline(List coordinates,int haveArrivedIndex) { - if (mMapDirectionView != null) { - mMapDirectionView.setCoordinatesLatLng(coordinates,haveArrivedIndex); - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - mMapDirectionView.drawablePolyline(); - } - }); - } - } - public void clearMapView() { if (mMapDirectionView != null) { UiThreadHandler.post(new Runnable() { @Override public void run() { - mMapDirectionView.clearPolyline(); - mMapDirectionView.clearCoordinatesLatLng(); +// mMapDirectionView.clearPolyline(); +// mMapDirectionView.clearCoordinatesLatLng(); } }); } diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/mapdirectionview/BusPassengerMapDirectionView.kt b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/mapdirectionview/BusPassengerMapDirectionView.kt new file mode 100644 index 0000000000..3f9595584c --- /dev/null +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/mapdirectionview/BusPassengerMapDirectionView.kt @@ -0,0 +1,349 @@ +package com.mogo.och.bus.passenger.ui.mapdirectionview + +import android.content.Context +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.RelativeLayout +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.amap.api.maps.AMap +import com.amap.api.maps.TextureMapView +import com.amap.api.maps.model.BitmapDescriptor +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.CustomMapStyleOptions +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.Polyline +import com.amap.api.maps.model.PolylineOptions +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +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.UiThreadHandler +import com.mogo.och.bus.passenger.R +import com.mogo.och.bus.passenger.ui.IBusPassengerMapDirectionView +import com.mogo.och.bus.passenger.utils.BusPassengerMapAssetStyleUtil + +/** + * 乘客屏小地图 + */ +class BusPassengerMapDirectionView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener, + IBusPassengerMapDirectionView, AMap.OnCameraChangeListener, + MapDirectionViewModel.ItineraryViewCallback { + companion object { + //小地图名称 + const val TAG = "BusPassengerMapDirectionView" + } + + private lateinit var mAMapNaviView: TextureMapView + private lateinit var mAMap: AMap + private var mPolyline: Polyline? = null + private val mLineMarkers: MutableList = ArrayList() + private lateinit var mCarMarker: Marker + + private val mLineStationLatLng: MutableList = ArrayList() //站点坐标数据 + var textureList: MutableList = ArrayList() + var texIndexList: MutableList = ArrayList() + private var mArrivedRes: BitmapDescriptor? = null + private var mUnArrivedRes: BitmapDescriptor? = null + + private val routeArrived: MutableList = ArrayList() + private val routeArriving: MutableList = ArrayList() + private var location: MogoLocation? = null + + init { + try { + initView(context) + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun initView(context: Context) { + d(SceneConstant.M_BUS_P + TAG, "initView") + val smpView = LayoutInflater.from(context).inflate(R.layout.bus_p_map_view, this) + mAMapNaviView = smpView.findViewById(R.id.bus_p_line_amap_view) as TextureMapView + initAMapView() + + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + } + + private fun initAMapView() { + mAMap = mAMapNaviView.map + // 设置导航地图模式,aMap是地图控制器对象。 + mAMap.mapType = AMap.MAP_TYPE_NIGHT + + // 关闭显示实时路况图层,aMap是地图控制器对象。 + mAMap.isTrafficEnabled = false + + // 设置 锚点 图标 + mCarMarker = mAMap.addMarker( + MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_car)) + .anchor(0.5f, 0.5f) + ) + mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_arrived) + mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_un_arrive) + + // 加载自定义样式 + val customMapStyleOptions = CustomMapStyleOptions() + .setEnable(true) + .setStyleData( + BusPassengerMapAssetStyleUtil.getAssetsStyle( + context, "map_style.data" + ) + ) + .setStyleExtraData( + BusPassengerMapAssetStyleUtil.getAssetsExtraStyle( + context, "map_style_extra.data" + ) + ) + // 设置自定义样式 + mAMap.setCustomMapStyle(customMapStyleOptions) + + // 设置地图的样式 + mAMap.uiSettings.apply { + isZoomControlsEnabled = false // 地图缩放级别的交换按钮 + setAllGesturesEnabled(true) // 所有手势 + isMyLocationButtonEnabled = false // 显示默认的定位按钮 + setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可 + } + + mAMap.setOnMapLoadedListener { + d(SceneConstant.M_BUS_P + TAG, "smp---onMapLoaded") + // 加载自定义样式 + val options = CustomMapStyleOptions() + .setEnable(true) + .setStyleData( + BusPassengerMapAssetStyleUtil.getAssetsStyle( + context, "map_style.data" + ) + ) + .setStyleExtraData( + BusPassengerMapAssetStyleUtil.getAssetsExtraStyle( + context, "map_style_extra.data" + ) + ) + // 设置自定义样式 + mAMap.setCustomMapStyle(options) + mAMapNaviView.map.setPointToCenter( + mAMapNaviView.width / 2, + mAMapNaviView.height / 2 + ) + } + + //设置地图状态的监听接口 + mAMap.setOnCameraChangeListener(this) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + val viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(MapDirectionViewModel::class.java) + } + viewModel?.setDistanceCallback(this) + } + + fun clearMapView() { + UiThreadHandler.post( { + clearPolyline() + clearCoordinatesLatLng() + }, UiThreadHandler.MODE.QUEUE) + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + if (mogoLocation == null) { + return + } + val currentLatLng = LatLng(mogoLocation.latitude, mogoLocation.longitude) + + //更新车辆位置 + mCarMarker.rotateAngle = (360 - mogoLocation.heading).toFloat() + mCarMarker.position = currentLatLng + mCarMarker.setToTop() + try { + //圈定地图显示范围 + val boundsBuilder = LatLngBounds.Builder() + routeArrived.forEach { + boundsBuilder.include(it) + } + routeArriving.forEach { + boundsBuilder.include(it) + } + mLineStationLatLng.forEach { + boundsBuilder.include(it) + } + boundsBuilder.include(currentLatLng) +// mAMap.moveCamera( +// CameraUpdateFactory.newLatLngBoundsRect( +// boundsBuilder.build(), +// 100, +// 100, +// 100, +// 100 +// ) +// ) + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun drawablePolyline() { + if (routeArrived.isEmpty() && routeArriving.isEmpty()) { + d(SceneConstant.M_TAXI + TAG, "没有点") + return + } + texIndexList.clear() + val allPoints = ArrayList(routeArrived) + for (i in routeArrived.indices) { + if (routeArrived.size > 1 && i < routeArrived.size - 1) { + texIndexList.add(0) + } + } + texIndexList.add(0) + location?.let { + allPoints.add(LatLng(it.latitude, it.longitude)) + } + allPoints.addAll(routeArriving) + for (ignored in routeArrived) { + texIndexList.add(1) + } + mPolyline?.let { + it.points = allPoints + it.options.customTextureIndex = texIndexList + return + } + if (textureList.isEmpty()) { + textureList.add(mArrivedRes) + textureList.add(mUnArrivedRes) + } + //设置线段纹理 + val polylineOptions = PolylineOptions().apply { + addAll(allPoints) + isUseTexture = true + width(15f) + lineCapType(PolylineOptions.LineCapType.LineCapRound) + customTextureList = textureList + customTextureIndex = texIndexList + } + + // 绘制线 + mPolyline = mAMap.addPolyline(polylineOptions) + } + + override fun clearPolyline() { + mPolyline?.remove() + mPolyline = null + } + + override fun setLineMarker() {} + + fun clearCoordinatesLatLng() { + textureList.clear() + texIndexList.clear() + routeArrived.clear() + routeArriving.clear() + mLineStationLatLng.clear() + d(SceneConstant.M_BUS_P + TAG, " mCoordinatesLatLng.clear ") + } + + fun onCreateView(savedInstanceState: Bundle?) { + mAMapNaviView.onCreate(savedInstanceState) + } + + fun onResume() { + mAMapNaviView.onResume() + } + + fun onPause() { + mAMapNaviView.onPause() + } + + fun onDestroy() { + mAMapNaviView.onDestroy() + } + + override fun setCoordinatesLatLng( + routeArrived: List, + routeArriving: List, + location: MogoLocation? + ) { + this.routeArrived.clear() + this.routeArrived.addAll(routeArrived) + this.routeArriving.clear() + this.routeArriving.addAll(routeArriving) + this.location = location + UiThreadHandler.post({ + drawablePolyline() + }, UiThreadHandler.MODE.QUEUE) + } + + fun clearLineMarkers() { + for (i in mLineMarkers.indices) { + mLineMarkers[i].isVisible = false + mLineMarkers[i].remove() + } + mLineMarkers.clear() + } + + fun setLinePointMarkerAndDraw(mLineStationsList: List, currentIndex: Int) { + clearLineMarkers() + mLineStationLatLng.clear() + mLineStationLatLng.addAll(mLineStationsList) + if (mLineStationsList.isNotEmpty()) { + // 起点marker, 终点marker, 过站marker, 未过站marker + val size = mLineStationsList.size + val mStartMarker = mAMap.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_start_point)) + ) + val mEndMarker = mAMap.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_end_point)) + ) + mStartMarker.position = mLineStationsList[0] + mLineMarkers.add(0, mStartMarker) + for (i in mLineStationsList.indices) { + if (currentIndex <= i && i < size - 1 && i > 0) { //未到达 + val unArrivedMarker = mAMap.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_unarrived_point)) + ) + unArrivedMarker.position = mLineStationsList[i] + mLineMarkers.add(i, unArrivedMarker) + } else if (i in 1 until currentIndex) { + val arrivedMarker = mAMap.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrived_point)) + ) + arrivedMarker.position = mLineStationsList[i] + mLineMarkers.add(i, arrivedMarker) + } + } + mEndMarker.position = mLineStationsList[size - 1] + mLineMarkers.add(size - 1, mEndMarker) + } + } + + override fun onCameraChange(cameraPosition: CameraPosition) { + } + + override fun onCameraChangeFinish(cameraPosition: CameraPosition) {} + +} \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/mapdirectionview/MapDirectionViewModel.kt b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/mapdirectionview/MapDirectionViewModel.kt new file mode 100644 index 0000000000..c1be106fb8 --- /dev/null +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/mapdirectionview/MapDirectionViewModel.kt @@ -0,0 +1,60 @@ +package com.mogo.och.bus.passenger.ui.mapdirectionview + +import androidx.lifecycle.ViewModel +import com.amap.api.maps.model.LatLng +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager + +class MapDirectionViewModel: ViewModel(), ITrajectoryListener { + + private val TAG = MapDirectionViewModel::class.java.simpleName + + private var viewCallback:ItineraryViewCallback?=null + + + init { + TrajectoryAndDistanceManager.addTrajectoryListener(TAG,this) + } + + fun setDistanceCallback(viewCallback:ItineraryViewCallback){ + this.viewCallback = viewCallback + } + + + override fun onCleared() { + super.onCleared() + this.viewCallback = null + TrajectoryAndDistanceManager.removeListener(TAG) + } + + interface ItineraryViewCallback{ + fun setCoordinatesLatLng(routeArrived: List, routeArriving: List, location: MogoLocation?) + } + + override fun trajectoryCallback( + routeArrivied: MutableList, + routeArriving: MutableList, + location: MogoLocation + ) { + val routeArrivedTemp: MutableList = ArrayList() + val routeArrivingTemp: MutableList = ArrayList() + var temp: LatLng + for (mogoLocation in routeArrivied) { + temp = LatLng(mogoLocation.latitude, mogoLocation.longitude) + routeArrivedTemp.add(temp) + } + for (mogoLocation in routeArriving) { + temp = LatLng(mogoLocation.latitude, mogoLocation.longitude) + routeArrivingTemp.add(temp) + } + this.viewCallback?.setCoordinatesLatLng( + routeArrivedTemp, + routeArrivingTemp, + location + ) + CallerLogger.d(TAG,"已经走过的点routeArrivied:${routeArrivied.size} 未走过的点:routeArriving:${routeArriving.size}") + } + +} \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java index ac7db3446d..fb81626293 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java @@ -49,8 +49,6 @@ public class BPRouteDataTestUtils { list.add(builder.build()); } BusPassengerModel.getInstance().updateRoutePoints(list); - BusPassengerModel.getInstance().startRemainRouteInfo(); - BusPassengerModel.getInstance().startToRouteAndWipe(); } catch (JSONException e) { e.printStackTrace(); } diff --git a/OCH/shuttle/passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml b/OCH/shuttle/passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml index ed1d36cdda..9172d23975 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml +++ b/OCH/shuttle/passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml @@ -11,7 +11,7 @@ android:layout_height="match_parent" app:styleMode="MAP_STYLE_DAY_VR" app:isWeatherEnable="false" - app:locationIcon3DRes="@raw/m2" + app:locationIcon3DRes="@raw/xiaoba" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> diff --git a/OCH/shuttle/passenger/src/jinlvvan/res/layout/bus_p_route_fragment.xml b/OCH/shuttle/passenger/src/jinlvvan/res/layout/bus_p_route_fragment.xml index 5ada0511f4..0215d426e2 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/res/layout/bus_p_route_fragment.xml +++ b/OCH/shuttle/passenger/src/jinlvvan/res/layout/bus_p_route_fragment.xml @@ -267,7 +267,7 @@ - - + \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/m2/res/layout/p_m2_driving_info_fragment.xml b/OCH/shuttle/passenger/src/m2/res/layout/p_m2_driving_info_fragment.xml index 25732e03b3..74bc6bf36c 100644 --- a/OCH/shuttle/passenger/src/m2/res/layout/p_m2_driving_info_fragment.xml +++ b/OCH/shuttle/passenger/src/m2/res/layout/p_m2_driving_info_fragment.xml @@ -55,8 +55,8 @@ @@ -139,8 +139,8 @@ app:layout_constraintBottom_toBottomOf="@+id/tv_next_station_title" app:layout_constraintStart_toEndOf="@+id/tv_next_station_title" android:id="@+id/iv_animal_list" - android:layout_width="@dimen/dp_25" - android:layout_height="@dimen/dp_30" + android:layout_width="@dimen/dp_18" + android:layout_height="@dimen/dp_32" android:src="@drawable/bg_p_m2_arrived_station" android:visibility="gone" android:layout_marginStart="@dimen/dp_7" /> @@ -149,14 +149,14 @@ android:id="@+id/station_name_tv" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_18" + android:layout_marginTop="@dimen/dp_6" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:gravity="left" android:singleLine="true" android:text="@string/m2_p_empty_tv" android:textColor="@color/shuttle_color_17417B" - android:textSize="@dimen/dp_34" + android:textSize="@dimen/dp_56" android:textStyle="bold" app:customGap="0.2" app:layout_constraintStart_toStartOf="@+id/tv_next_station_title" @@ -170,14 +170,13 @@ android:id="@+id/clg_distance_left_time" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:visibility="gone" app:constraint_referenced_ids="bg_distance_lefttime,bg_distance_lefttime_split,tv_distance,tv_left_time" /> @@ -198,7 +197,7 @@ android:layout_height="wrap_content" android:text="--" android:textColor="@color/shuttle_color_2d3e5f" - android:textSize="@dimen/dp_20" + android:textSize="@dimen/dp_26" app:layout_constraintBottom_toBottomOf="@+id/bg_distance_lefttime" app:layout_constraintEnd_toStartOf="@+id/bg_distance_lefttime_split" app:layout_constraintStart_toStartOf="@+id/bg_distance_lefttime" @@ -210,7 +209,7 @@ android:layout_height="wrap_content" android:text="--" android:textColor="@color/shuttle_color_2d3e5f" - android:textSize="@dimen/dp_20" + android:textSize="@dimen/dp_26" app:layout_constraintBottom_toBottomOf="@+id/bg_distance_lefttime" app:layout_constraintEnd_toEndOf="@+id/bg_distance_lefttime" app:layout_constraintStart_toEndOf="@+id/bg_distance_lefttime_split" @@ -220,15 +219,15 @@ @@ -255,7 +254,7 @@ android:layout_marginStart="@dimen/dp_50" android:text="0" android:textColor="@color/m2_p_speed_tv_color" - android:textSize="@dimen/dp_60" + android:textSize="@dimen/dp_70" android:textStyle="bold" app:layout_constraintStart_toStartOf="@+id/aciv_speed_time_bg" app:layout_constraintTop_toTopOf="@+id/viewTextClockHouerMin" @@ -275,27 +274,28 @@ @@ -338,13 +338,13 @@ android:format12Hour="HH:mm" android:format24Hour="HH:mm" android:gravity="center" - android:layout_marginTop="@dimen/dp_25" + android:layout_marginTop="@dimen/dp_10" app:layout_constraintTop_toTopOf="@+id/aciv_speed_time_bg" app:layout_constraintStart_toEndOf="@+id/view_split" android:layout_marginEnd="@dimen/dp_90" android:textColor="@color/shuttle_color_17417B" android:includeFontPadding="false" - android:textSize="@dimen/dp_46" /> + android:textSize="@dimen/dp_52" /> + android:textSize="@dimen/dp_26" /> + android:textSize="@dimen/dp_26" /> \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/m2/res/layout/p_m2_fragment.xml b/OCH/shuttle/passenger/src/m2/res/layout/p_m2_fragment.xml index d9ffccbf35..c1a974d194 100644 --- a/OCH/shuttle/passenger/src/m2/res/layout/p_m2_fragment.xml +++ b/OCH/shuttle/passenger/src/m2/res/layout/p_m2_fragment.xml @@ -23,6 +23,7 @@ android:layout_width="1080dp" android:layout_height="@dimen/dp_612"/> + android:layout_marginBottom="-40dp" + app:layout_constraintBottom_toTopOf="@+id/zv_msg_pop_bottom" + app:layout_constraintEnd_toEndOf="parent" + android:layout_marginEnd="@dimen/dp_40" + /> - + + + + \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/m2/res/layout/p_m2_hpmap_fragment.xml b/OCH/shuttle/passenger/src/m2/res/layout/p_m2_hpmap_fragment.xml index 3efa0675a3..5c9a902baa 100644 --- a/OCH/shuttle/passenger/src/m2/res/layout/p_m2_hpmap_fragment.xml +++ b/OCH/shuttle/passenger/src/m2/res/layout/p_m2_hpmap_fragment.xml @@ -8,7 +8,7 @@ diff --git a/OCH/shuttle/passenger/src/m2/res/raw/star_marker.nt3d b/OCH/shuttle/passenger/src/m2/res/raw/star_marker.nt3d new file mode 100644 index 0000000000..c6e546fc31 Binary files /dev/null and b/OCH/shuttle/passenger/src/m2/res/raw/star_marker.nt3d differ diff --git a/OCH/shuttle/passenger/src/main/AndroidManifest.xml b/OCH/shuttle/passenger/src/main/AndroidManifest.xml index e0687231c1..f35a9aa1b7 100644 --- a/OCH/shuttle/passenger/src/main/AndroidManifest.xml +++ b/OCH/shuttle/passenger/src/main/AndroidManifest.xml @@ -1,5 +1,10 @@ - + + + \ No newline at end of file diff --git a/OCH/shuttle/passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java b/OCH/shuttle/passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java index edab28cb78..3cad825966 100644 --- a/OCH/shuttle/passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java +++ b/OCH/shuttle/passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java @@ -19,7 +19,10 @@ public class BusPassengerMapAssetStyleUtil { is1 = context.getResources().getAssets().open(fileName); //eg. over_view_style.data int lenght1 = is1.available(); buffer1 = new byte[lenght1]; - is1.read(buffer1); + int count = 0; + while ((count = is1.read(buffer1)) > 0) { + is1.read(buffer1); + } } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/OCH/sweeper/sweeper-cloud/build.gradle b/OCH/sweeper/sweeper-cloud/build.gradle index 499a56f6dc..a9b1d5ecce 100644 --- a/OCH/sweeper/sweeper-cloud/build.gradle +++ b/OCH/sweeper/sweeper-cloud/build.gradle @@ -62,6 +62,8 @@ dependencies { implementation project(":OCH:mogo-och-common-module") compileOnly project(":libraries:mogo-map") + androidTestImplementation rootProject.ext.dependencies.androidxjunit + testImplementation rootProject.ext.dependencies.junit } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() \ No newline at end of file diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/BaseSweeperTabFragment.java b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/BaseSweeperTabFragment.java index 6da04fafed..7b29c037cb 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/BaseSweeperTabFragment.java +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/BaseSweeperTabFragment.java @@ -128,55 +128,52 @@ public abstract class BaseSweeperTabFragment { - ToastUtils.showLong("读取失败=" + err); - }); - } - - @Override - public void onParseFailed(String err) { - ToastUtils.showLong("解析失败=" + err); - } - - @Override - public void onParse(MessagePad.SetAutopilotModeReq bean) { - ToastUtils.showLong("下发命令\n" + TextFormat.printer().escapingNonAscii(false).printToString(bean)); - AutopilotControlParameters parameters = new AutopilotControlParameters(); - MessagePad.RouteInfo routeInfo = bean.getRouteInfo(); - if (routeInfo.getRouteID() > 0) { - parameters.routeID = routeInfo.getRouteID(); - } - parameters.routeName = routeInfo.getRouteName(); - parameters.startName = routeInfo.getStartName();//拼音 - parameters.endName = routeInfo.getEndName();//拼音 - parameters.startLatLon = new AutopilotControlParameters - .AutoPilotLonLat(routeInfo.getStartLocation().getLatitude(), routeInfo.getStartLocation().getLongitude()); - parameters.endLatLon = new AutopilotControlParameters - .AutoPilotLonLat(routeInfo.getEndLocation().getLatitude(), routeInfo.getEndLocation().getLongitude()); - parameters.vehicleType = 10; - MessagePad.Line line = routeInfo.getLine(); - parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( - line.getLineId(), line.getLineName(), - line.getTrajUrl(), line.getTrajMd5(), - line.getStopUrl(), line.getStopMd5(), - line.getTimestamp(), line.getVehicleModel(), - line.getTrajUrlDpqp(), line.getTrajMd5Dpqp(), - line.getStopUrlDpqp(), line.getStopMd5Dpqp(), - line.getTimestampDpqp()); - CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters); - } - }).read(); + findViewById(R.id.btnStartAutopilot).setOnClickListener(v -> { + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { + ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + ", 请稍候重试"); + return; } + new AutopilotModeConfigManager(new AutopilotModeConfigManager.OnReadAutopilotModeConfigListener() { + @Override + public void onReadFailed(String err) { + ThreadUtils.runOnUiThread(() -> { + ToastUtils.showLong("读取失败=" + err); + }); + } + + @Override + public void onParseFailed(String err) { + ToastUtils.showLong("解析失败=" + err); + } + + @Override + public void onParse(MessagePad.SetAutopilotModeReq bean) { + ToastUtils.showLong("下发命令\n" + TextFormat.printer().escapingNonAscii(false).printToString(bean)); + AutopilotControlParameters parameters = new AutopilotControlParameters(); + MessagePad.RouteInfo routeInfo = bean.getRouteInfo(); + if (routeInfo.getRouteID() > 0) { + parameters.routeID = routeInfo.getRouteID(); + } + parameters.routeName = routeInfo.getRouteName(); + parameters.startName = routeInfo.getStartName();//拼音 + parameters.endName = routeInfo.getEndName();//拼音 + parameters.startLatLon = new AutopilotControlParameters + .AutoPilotLonLat(routeInfo.getStartLocation().getLatitude(), routeInfo.getStartLocation().getLongitude()); + parameters.endLatLon = new AutopilotControlParameters + .AutoPilotLonLat(routeInfo.getEndLocation().getLatitude(), routeInfo.getEndLocation().getLongitude()); + parameters.vehicleType = 10; + MessagePad.Line line = routeInfo.getLine(); + parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( + line.getLineId(), line.getLineName(), + line.getTrajUrl(), line.getTrajMd5(), + line.getStopUrl(), line.getStopMd5(), + line.getTimestamp(), line.getVehicleModel(), + line.getTrajUrlDpqp(), line.getTrajMd5Dpqp(), + line.getStopUrlDpqp(), line.getStopMd5Dpqp(), + line.getTimestampDpqp()); + CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters); + } + }).read(); }); // 模拟 查询当前任务 findViewById(R.id.btnQueryCurrentTask).setOnClickListener(view -> @@ -437,7 +434,6 @@ public abstract class BaseSweeperTabFragment { - // TODO: 2021/12/9 CallerHmiManager.INSTANCE.showToolsView(); }); if (mCardBtn != null) { @@ -458,8 +454,8 @@ public abstract class BaseSweeperTabFragment msgTypeAndReqNo = new HashMap<>(); + private final HashMap msgTypeAndReqNo = new HashMap<>(); public static SweeperTaskModel getInstance() { if (sInstance == null) { @@ -149,38 +148,35 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM //2022.1.28 // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 // The exception could not be delivered to the consumer because it has already canceled/disposed - // the flow or the excTeption has nowhere to go to begin with - RxJavaPlugins.setErrorHandler(new Consumer() { - @Override - public void accept(Throwable e) { - if (e instanceof UndeliverableException) { - e = e.getCause(); - CallerLogger.d(M_SWEEPER + TAG, "UndeliverableException"); - } - if ((e instanceof IOException)) {// - // fine, irrelevant network problem or API that throws on cancellation - CallerLogger.d(M_SWEEPER + TAG, "IOException"); - return; - } - if (e instanceof InterruptedException) { - // fine, some blocking code was interrupted by a dispose call - CallerLogger.d(M_SWEEPER + TAG, "InterruptedException"); - return; - } - if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { - // that's likely a bug in the application - CallerLogger.d(M_SWEEPER + TAG, "NullPointerException or IllegalArgumentException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - if (e instanceof IllegalStateException) { - // that's a bug in RxJava or in a custom operator - CallerLogger.d(M_SWEEPER + TAG, "IllegalStateException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - CallerLogger.d(M_SWEEPER + TAG, "Undeliverable exception"); + // the flow or the exception has nowhere to go to begin with + RxJavaPlugins.setErrorHandler(e -> { + if (e instanceof UndeliverableException) { + e = e.getCause(); + CallerLogger.d(M_SWEEPER + TAG, "UndeliverableException"); } + if ((e instanceof IOException)) {// + // fine, irrelevant network problem or API that throws on cancellation + CallerLogger.d(M_SWEEPER + TAG, "IOException"); + return; + } + if (e instanceof InterruptedException) { + // fine, some blocking code was interrupted by a dispose call + CallerLogger.d(M_SWEEPER + TAG, "InterruptedException"); + return; + } + if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { + // that's likely a bug in the application + CallerLogger.d(M_SWEEPER + TAG, "NullPointerException or IllegalArgumentException"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + if (e instanceof IllegalStateException) { + // that's a bug in RxJava or in a custom operator + CallerLogger.d(M_SWEEPER + TAG, "IllegalStateException"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + CallerLogger.d(M_SWEEPER + TAG, "Undeliverable exception"); }); } @@ -279,11 +275,6 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null); } - private Object readResolve() { - // 阻止反序列化,必须实现 Serializable 接口 - return sInstance; - } - private final IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() { // VR mode变更回调 @Override @@ -424,9 +415,6 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM @Override public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { - if (cleanSystemState == null) { - return; - } long current = System.currentTimeMillis(); if (current - mVehicleStateCurrentTimeMillis <= VEHICLE_STATE_INTERVAL_MILLIS) { return; @@ -506,7 +494,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } private static String format(double value) { - BigDecimal bd = new BigDecimal(value); + BigDecimal bd = BigDecimal.valueOf(value); bd = bd.setScale(2, RoundingMode.HALF_UP); return bd.toString(); } @@ -688,18 +676,18 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM if (mControllerStatusCallback != null) { mControllerStatusCallback.onAutopilotState(state); } - switch (state) { - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE://不可自动驾驶 - break; - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE://人工驾驶 - break; - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING://自动驾驶中 - break; - case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING://平行驾驶 - break; - default: - break; - } +// switch (state) { +// case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE://不可自动驾驶 +// break; +// case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE://人工驾驶 +// break; +// case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING://自动驾驶中 +// break; +// case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING://平行驾驶 +// break; +// default: +// break; +// } } @Override diff --git a/OCH/sweeper/sweeper/build.gradle b/OCH/sweeper/sweeper/build.gradle index 499a56f6dc..1471267780 100644 --- a/OCH/sweeper/sweeper/build.gradle +++ b/OCH/sweeper/sweeper/build.gradle @@ -62,6 +62,9 @@ dependencies { implementation project(":OCH:mogo-och-common-module") compileOnly project(":libraries:mogo-map") + androidTestImplementation rootProject.ext.dependencies.androidxjunit + testImplementation rootProject.ext.dependencies.junit + } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() \ No newline at end of file diff --git a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/SweeperProvider.java b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/SweeperProvider.java index ac2436d4f6..6f14326a7c 100644 --- a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/SweeperProvider.java +++ b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/SweeperProvider.java @@ -36,14 +36,14 @@ public class SweeperProvider implements IMogoOCH { FragmentManager supportFragmentManager = activity.getSupportFragmentManager(); if (sweeperFragment == null) { CallerLogger.d(TAG, "准备add fragment======"); - Fragment fragmentByTag = supportFragmentManager.findFragmentByTag(sweeperFragment.TAG); + Fragment fragmentByTag = supportFragmentManager.findFragmentByTag(SweeperFragment.TAG); if (fragmentByTag instanceof SweeperFragment) { sweeperFragment = (SweeperFragment) fragmentByTag; } else { sweeperFragment = new SweeperFragment(); } if(!sweeperFragment.isAdded()) { - supportFragmentManager.beginTransaction().add(containerId, sweeperFragment, sweeperFragment.TAG).commitAllowingStateLoss(); + supportFragmentManager.beginTransaction().add(containerId, sweeperFragment, SweeperFragment.TAG).commitAllowingStateLoss(); } return; } diff --git a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java index cb8754febb..e9fc880d3e 100644 --- a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java +++ b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java @@ -408,8 +408,8 @@ public abstract class BaseSweeperTabFragment() { - @Override - public void accept(Throwable e) { - if (e instanceof UndeliverableException) { - e = e.getCause(); - CallerLogger.d(M_SWEEPER + TAG, "UndeliverableException"); - } - if ((e instanceof IOException)) {// - // fine, irrelevant network problem or API that throws on cancellation - CallerLogger.d(M_SWEEPER + TAG, "IOException"); - return; - } - if (e instanceof InterruptedException) { - // fine, some blocking code was interrupted by a dispose call - CallerLogger.d(M_SWEEPER + TAG, "InterruptedException"); - return; - } - if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { - // that's likely a bug in the application - CallerLogger.d(M_SWEEPER + TAG, "NullPointerException or IllegalArgumentException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - if (e instanceof IllegalStateException) { - // that's a bug in RxJava or in a custom operator - CallerLogger.d(M_SWEEPER + TAG, "IllegalStateException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - CallerLogger.d(M_SWEEPER + TAG, "Undeliverable exception"); + // the flow or the exception has nowhere to go to begin with + RxJavaPlugins.setErrorHandler(e -> { + if (e instanceof UndeliverableException) { + e = e.getCause(); + CallerLogger.d(M_SWEEPER + TAG, "UndeliverableException"); } + if ((e instanceof IOException)) { + // fine, irrelevant network problem or API that throws on cancellation + CallerLogger.d(M_SWEEPER + TAG, "IOException"); + return; + } + if (e instanceof InterruptedException) { + // fine, some blocking code was interrupted by a dispose call + CallerLogger.d(M_SWEEPER + TAG, "InterruptedException"); + return; + } + if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { + // that's likely a bug in the application + CallerLogger.d(M_SWEEPER + TAG, "NullPointerException or IllegalArgumentException"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + if (e instanceof IllegalStateException) { + // that's a bug in RxJava or in a custom operator + CallerLogger.d(M_SWEEPER + TAG, "IllegalStateException"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + CallerLogger.d(M_SWEEPER + TAG, "Undeliverable exception"); }); } @@ -191,7 +188,7 @@ public class SweeperTaskModel { @Override public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) { - if (null != routeList && routeList.getWayPointsList()!=null&&routeList.getWayPointsList().size() > 0) { + if (null != routeList && routeList.getWayPointsList().size() > 0) { if (mCurrentSubTaskDetail.getLineId() != mLineId) {//判断是否同一条路线 mLineId = mCurrentSubTaskDetail.getLineId(); points.addAll(coordinateConverterWgsToGcjList(mContext, routeList.getWayPointsList())); @@ -316,7 +313,6 @@ public class SweeperTaskModel { } if (SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.getCode() == mSubTaskType) {//人工驾驶子任务需要手动跳过,不能自动结束 addCoordinates(gnssInfo); - return; } //子任务完成的围栏判断 子任务正在执行中,还未到达子任务终点 //20230504 为了避免自车定位提前结束任务导致的溜车问题,这里删除自车自动触发到站 @@ -365,7 +361,6 @@ public class SweeperTaskModel { isAutopilotSubTaskArriveEndSite = true; //到达子任务终点 结束子任务 subTaskEnd(mIsFirstSubtask, mIsLastSubtask, mSubTaskId); //无自动驾驶到终点信息传null - return; } } @@ -393,10 +388,6 @@ public class SweeperTaskModel { firstStartAutopilot++; triggerStartServiceEvent(isRestart, false); AutopilotControlParameters parameters = initAutopilotControlParameters(); - if (null == parameters) { - CallerLogger.e(M_SWEEPER + TAG, "行程日志-AutopilotControlParameters is empty."); - return; - } CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters); CallerLogger.d(M_SWEEPER + TAG, "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName + @@ -496,10 +487,6 @@ public class SweeperTaskModel { private void updateAutopilotControlParameters() { AutopilotControlParameters parameters = initAutopilotControlParameters(); - if (null == parameters) { - CallerLogger.e(M_SWEEPER + TAG, "AutopilotControlParameters is empty."); - return; - } CallerLogger.d(M_SWEEPER + TAG, "AutopilotControlParameters" + GsonUtil.jsonFromObject(parameters)); CallerLogger.d(M_SWEEPER + TAG, "AutopilotControlParameters is update."); CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters); diff --git a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/view/BusArcView.java b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/view/BusArcView.java index d559214b15..04fa056c2f 100644 --- a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/view/BusArcView.java +++ b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/view/BusArcView.java @@ -30,7 +30,7 @@ public class BusArcView extends View { //圆弧颜色 private int mArcColor; //圆弧的画笔的宽度 - private float mStrokeWith = getResources().getDimension(R.dimen.sweeper_ext_arcView_stroke_with); + private final float mStrokeWith = getResources().getDimension(R.dimen.sweeper_ext_arcView_stroke_with); //文字描述的paint private Paint mTextPaint; @@ -39,9 +39,9 @@ public class BusArcView extends View { //当前数据 private int currentValue; //最大数据 - private int maxValue = 240; + private final int maxValue = 240; //圆弧背景的开始和结束间的夹角大小 - private float mAngle = 270; + private final float mAngle = 270; //上次绘制圆弧夹角 private float lastAngle = 0; @@ -75,13 +75,13 @@ public class BusArcView extends View { mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); //绘制中心的数值 mTextPaint.getTextBounds(mValue, 0, mValue.length(), mRect); - canvas.drawText(mValue, getWidth() / 2, getHeight() / 2 + mRect.height() / 2 - 10, mTextPaint); + canvas.drawText(mValue, getWidth() / 2.0f, getHeight() / 2.0f + mRect.height() / 2.0f - 10, mTextPaint); mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); //绘制中心文字描述 mTextPaint.setTextSize(getResources().getDimension(R.dimen.sweeper_ext_arcView_des_text_size)); mTextPaint.getTextBounds(mDes, 0, mDes.length(), mRect); - canvas.drawText(mDes, getWidth() / 2, getHeight() * 17 / 20 + mRect.height() / 2, mTextPaint); + canvas.drawText(mDes, getWidth() / 2.0f, getHeight() * 17.0f / 20.0f + mRect.height() / 2.0f, mTextPaint); } private void drawArc(Canvas canvas) { @@ -135,13 +135,10 @@ public class BusArcView extends View { ValueAnimator progressAnimator = ValueAnimator.ofFloat(startAngle, currentAngle); progressAnimator.setDuration(time); progressAnimator.setTarget(mIncludedAngle); - progressAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - mIncludedAngle = (float) animation.getAnimatedValue(); - //重新绘制,不然不会出现效果 - postInvalidate(); - } + progressAnimator.addUpdateListener(animation -> { + mIncludedAngle = (float) animation.getAnimatedValue(); + //重新绘制,不然不会出现效果 + postInvalidate(); }); //开始执行动画 progressAnimator.start(); diff --git a/OCH/taxi/driver/src/main/AndroidManifest.xml b/OCH/taxi/driver/src/main/AndroidManifest.xml index fb42392054..ae926fbcd8 100644 --- a/OCH/taxi/driver/src/main/AndroidManifest.xml +++ b/OCH/taxi/driver/src/main/AndroidManifest.xml @@ -1,5 +1,2 @@ - - - / + \ No newline at end of file diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index 23306f26dd..b2ce0b60f2 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -5,6 +5,8 @@ import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_SOURCE_ADA import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; +import static java.util.Collections.emptyList; + import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; @@ -123,8 +125,8 @@ public class TaxiModel { private volatile String mPrevOrderNo = ""; //前一次的新到单id(当次和前一次orderId相同时,本次不再弹出) private volatile OrderQueryRespBean.Result mNewBookingOrder; //新到待抢预约单 private volatile OrderQueryRespBean.Result mCurrentOCHOrder; //当前订单 - private volatile List mInServiceList = Collections.emptyList(); //进行中订单 - private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单 + private List mInServiceList = Collections.synchronizedList(emptyList()); //进行中订单 + private volatile List mWaitServiceList = emptyList(); //待服务订单 private ITaxiADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关 private ITaxiCarOperationalCallback mCarOperationalCallback; //Model->Presenter:登录状态和司机今日接单状态 @@ -135,7 +137,7 @@ public class TaxiModel { private volatile boolean isRestartAutopilot = false; private final List mRoutePoints = new ArrayList<>(); - private int mPreRouteIndex = 0; + private final int mPreRouteIndex = 0; private double mLongitude, mLatitude; private MogoLocation mLocation = null; @@ -180,37 +182,34 @@ public class TaxiModel { //2022.1.28 // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with - RxJavaPlugins.setErrorHandler(new Consumer() { - @Override - public void accept(Throwable e) { - if (e instanceof UndeliverableException) { - e = e.getCause(); - CallerLogger.d(M_TAXI + TAG, "UndeliverableException"); - } - if ((e instanceof IOException)) {// - // fine, irrelevant network problem or API that throws on cancellation - CallerLogger.d(M_TAXI + TAG, "IOException"); - return; - } - if (e instanceof InterruptedException) { - // fine, some blocking code was interrupted by a dispose call - CallerLogger.d(M_TAXI + TAG, "InterruptedException"); - return; - } - if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { - // that's likely a bug in the application - CallerLogger.d(M_TAXI + TAG, "NullPointerException or IllegalArgumentException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - if (e instanceof IllegalStateException) { - // that's a bug in RxJava or in a custom operator - CallerLogger.d(M_TAXI + TAG, "IllegalStateException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - CallerLogger.d(M_TAXI + TAG, "Undeliverable exception"); + RxJavaPlugins.setErrorHandler(e -> { + if (e instanceof UndeliverableException) { + e = e.getCause(); + CallerLogger.d(M_TAXI + TAG, "UndeliverableException"); } + if ((e instanceof IOException)) {// + // fine, irrelevant network problem or API that throws on cancellation + CallerLogger.d(M_TAXI + TAG, "IOException"); + return; + } + if (e instanceof InterruptedException) { + // fine, some blocking code was interrupted by a dispose call + CallerLogger.d(M_TAXI + TAG, "InterruptedException"); + return; + } + if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { + // that's likely a bug in the application + CallerLogger.d(M_TAXI + TAG, "NullPointerException or IllegalArgumentException"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + if (e instanceof IllegalStateException) { + // that's a bug in RxJava or in a custom operator + CallerLogger.d(M_TAXI + TAG, "IllegalStateException"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + CallerLogger.d(M_TAXI + TAG, "Undeliverable exception"); }); } @@ -1595,8 +1594,8 @@ public class TaxiModel { /** * 上报订单剩余里程和时间 单位:KM, M, 单位:秒 * - * @param lastSumLength - * @param duration + * @param lastSumLength 上报订单剩余里程 + * @param duration 上报订单剩余时间 */ public void reportOrderRemain(long lastSumLength, long duration) {// 米/秒 if (mCurrentOCHOrder == null) return; @@ -1737,18 +1736,15 @@ public class TaxiModel { mOrderStatusCallback.onNaviToEnd(false, isShow); } } else {//若直接要显示导航地图则直接导航, 若不是则2s后若无轨迹数据使用高德导航 - if (isShow && mRoutePoints.size() == 0 && mOrderStatusCallback != null) { + if (isShow && mOrderStatusCallback != null) { mOrderStatusCallback.onNaviToEnd(true, true); } else { - UiThreadHandler.postDelayed(new Runnable() { - @Override - public void run() { - if (mRoutePoints.size() == 0 && mOrderStatusCallback != null) { - mOrderStatusCallback.onNaviToEnd(true, false); - } + UiThreadHandler.postDelayed(() -> { + if (mRoutePoints.size() == 0 && mOrderStatusCallback != null) { + mOrderStatusCallback.onNaviToEnd(true, false); } - }, 2000l); + }, 2000L); } } diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt index 336357d774..655a132350 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt @@ -5,7 +5,6 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.drawable.BitmapDrawable import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.function.api.autopilot.IMoGoBackCameraVideoListener @@ -128,7 +127,7 @@ class RightRearCamView : ConstraintLayout , IMoGoBackCameraVideoListener, private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int { val width = options.outWidth val height = options.outHeight - Log.i(TAG, "calculateInSampleSize: out width and height is $width height $height") + d(SceneConstant.M_TAXI_P + TAG, "calculateInSampleSize: out width and height is $width height $height") var inSampleWidth = 1 if (height > reqHeight || width > reqWidth) { val halfHeight = height / 2 diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/DiskLruCache.java b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/DiskLruCache.java index ce78bbf2d5..e69de29bb2 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/DiskLruCache.java +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/DiskLruCache.java @@ -1,974 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.mogo.och.taxi.passenger.utils.blur; - -import java.io.BufferedWriter; -import java.io.Closeable; -import java.io.EOFException; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * A cache that uses a bounded amount of space on a filesystem. Each cache - * entry has a string key and a fixed number of values. Each key must match - * the regex [a-z0-9_-]{1,64}. Values are byte sequences, - * accessible as streams or files. Each value must be between {@code 0} and - * {@code Integer.MAX_VALUE} bytes in length. - * - *

The cache stores its data in a directory on the filesystem. This - * directory must be exclusive to the cache; the cache may delete or overwrite - * files from its directory. It is an error for multiple processes to use the - * same cache directory at the same time. - * - *

This cache limits the number of bytes that it will store on the - * filesystem. When the number of stored bytes exceeds the limit, the cache will - * remove entries in the background until the limit is satisfied. The limit is - * not strict: the cache may temporarily exceed it while waiting for files to be - * deleted. The limit does not include filesystem overhead or the cache - * journal so space-sensitive applications should set a conservative limit. - * - *

Clients call {@link #edit} to create or update the values of an entry. An - * entry may have only one editor at one time; if a value is not available to be - * edited then {@link #edit} will return null. - *

    - *
  • When an entry is being created it is necessary to - * supply a full set of values; the empty value should be used as a - * placeholder if necessary. - *
  • When an entry is being edited, it is not necessary - * to supply data for every value; values default to their previous - * value. - *
- * Every {@link #edit} call must be matched by a call to {@link Editor#commit} - * or {@link Editor#abort}. Committing is atomic: a read observes the full set - * of values as they were before or after the commit, but never a mix of values. - * - *

Clients call {@link #get} to read a snapshot of an entry. The read will - * observe the value at the time that {@link #get} was called. Updates and - * removals after the call do not impact ongoing reads. - * - *

This class is tolerant of some I/O errors. If files are missing from the - * filesystem, the corresponding entries will be dropped from the cache. If - * an error occurs while writing a cache value, the edit will fail silently. - * Callers should handle other problems by catching {@code IOException} and - * responding appropriately. - */ -final class DiskLruCache implements Closeable { - static final String JOURNAL_FILE = "journal"; - static final String JOURNAL_FILE_TEMP = "journal.tmp"; - static final String JOURNAL_FILE_BACKUP = "journal.bkp"; - static final String MAGIC = "libcore.io.DiskLruCache"; - static final String VERSION_1 = "1"; - static final long ANY_SEQUENCE_NUMBER = -1; - static final Pattern LEGAL_KEY_PATTERN = Pattern.compile("[a-z0-9_-]{1,64}"); - private static final String CLEAN = "CLEAN"; - private static final String DIRTY = "DIRTY"; - private static final String REMOVE = "REMOVE"; - private static final String READ = "READ"; - - /* - * This cache uses a journal file named "journal". A typical journal file - * looks like this: - * libcore.io.DiskLruCache - * 1 - * 100 - * 2 - * - * CLEAN 3400330d1dfc7f3f7f4b8d4d803dfcf6 832 21054 - * DIRTY 335c4c6028171cfddfbaae1a9c313c52 - * CLEAN 335c4c6028171cfddfbaae1a9c313c52 3934 2342 - * REMOVE 335c4c6028171cfddfbaae1a9c313c52 - * DIRTY 1ab96a171faeeee38496d8b330771a7a - * CLEAN 1ab96a171faeeee38496d8b330771a7a 1600 234 - * READ 335c4c6028171cfddfbaae1a9c313c52 - * READ 3400330d1dfc7f3f7f4b8d4d803dfcf6 - * - * The first five lines of the journal form its header. They are the - * constant string "libcore.io.DiskLruCache", the disk cache's version, - * the application's version, the value count, and a blank line. - * - * Each of the subsequent lines in the file is a record of the state of a - * cache entry. Each line contains space-separated values: a state, a key, - * and optional state-specific values. - * o DIRTY lines track that an entry is actively being created or updated. - * Every successful DIRTY action should be followed by a CLEAN or REMOVE - * action. DIRTY lines without a matching CLEAN or REMOVE indicate that - * temporary files may need to be deleted. - * o CLEAN lines track a cache entry that has been successfully published - * and may be read. A publish line is followed by the lengths of each of - * its values. - * o READ lines track accesses for LRU. - * o REMOVE lines track entries that have been deleted. - * - * The journal file is appended to as cache operations occur. The journal may - * occasionally be compacted by dropping redundant lines. A temporary file named - * "journal.tmp" will be used during compaction; that file should be deleted if - * it exists when the cache is opened. - */ - - private final File directory; - private final File journalFile; - private final File journalFileTmp; - private final File journalFileBackup; - private final int appVersion; - private long maxSize; - private int maxFileCount; - private final int valueCount; - private long size = 0; - private int fileCount = 0; - private Writer journalWriter; - private final LinkedHashMap lruEntries = - new LinkedHashMap(0, 0.75f, true); - private int redundantOpCount; - - /** - * To differentiate between old and current snapshots, each entry is given - * a sequence number each time an edit is committed. A snapshot is stale if - * its sequence number is not equal to its entry's sequence number. - */ - private long nextSequenceNumber = 0; - - /** This cache uses a single background thread to evict entries. */ - final ThreadPoolExecutor executorService = - new ThreadPoolExecutor(0, 1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); - private final Callable cleanupCallable = new Callable() { - public Void call() throws Exception { - synchronized (DiskLruCache.this) { - if (journalWriter == null) { - return null; // Closed. - } - trimToSize(); - trimToFileCount(); - if (journalRebuildRequired()) { - rebuildJournal(); - redundantOpCount = 0; - } - } - return null; - } - }; - - private DiskLruCache(File directory, int appVersion, int valueCount, long maxSize, int maxFileCount) { - this.directory = directory; - this.appVersion = appVersion; - this.journalFile = new File(directory, JOURNAL_FILE); - this.journalFileTmp = new File(directory, JOURNAL_FILE_TEMP); - this.journalFileBackup = new File(directory, JOURNAL_FILE_BACKUP); - this.valueCount = valueCount; - this.maxSize = maxSize; - this.maxFileCount = maxFileCount; - } - - /** - * Opens the cache in {@code directory}, creating a cache if none exists - * there. - * - * @param directory a writable directory - * @param valueCount the number of values per cache entry. Must be positive. - * @param maxSize the maximum number of bytes this cache should use to store - * @param maxFileCount the maximum file count this cache should store - * @throws IOException if reading or writing the cache directory fails - */ - public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize, int maxFileCount) - throws IOException { - if (maxSize <= 0) { - throw new IllegalArgumentException("maxSize <= 0"); - } - if (maxFileCount <= 0) { - throw new IllegalArgumentException("maxFileCount <= 0"); - } - if (valueCount <= 0) { - throw new IllegalArgumentException("valueCount <= 0"); - } - - // If a bkp file exists, use it instead. - File backupFile = new File(directory, JOURNAL_FILE_BACKUP); - if (backupFile.exists()) { - File journalFile = new File(directory, JOURNAL_FILE); - // If journal file also exists just delete backup file. - if (journalFile.exists()) { - backupFile.delete(); - } else { - renameTo(backupFile, journalFile, false); - } - } - - // Prefer to pick up where we left off. - DiskLruCache cache = new DiskLruCache(directory, appVersion, valueCount, maxSize, maxFileCount); - if (cache.journalFile.exists()) { - try { - cache.readJournal(); - cache.processJournal(); - cache.journalWriter = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(cache.journalFile, true), Util.US_ASCII)); - return cache; - } catch (IOException journalIsCorrupt) { - System.out - .println("DiskLruCache " - + directory - + " is corrupt: " - + journalIsCorrupt.getMessage() - + ", removing"); - cache.delete(); - } - } - - // Create a new empty cache. - directory.mkdirs(); - cache = new DiskLruCache(directory, appVersion, valueCount, maxSize, maxFileCount); - cache.rebuildJournal(); - return cache; - } - - private void readJournal() throws IOException { - StrictLineReader reader = new StrictLineReader(new FileInputStream(journalFile), Util.US_ASCII); - try { - String magic = reader.readLine(); - String version = reader.readLine(); - String appVersionString = reader.readLine(); - String valueCountString = reader.readLine(); - String blank = reader.readLine(); - if (!MAGIC.equals(magic) - || !VERSION_1.equals(version) - || !Integer.toString(appVersion).equals(appVersionString) - || !Integer.toString(valueCount).equals(valueCountString) - || !"".equals(blank)) { - throw new IOException("unexpected journal header: [" + magic + ", " + version + ", " - + valueCountString + ", " + blank + "]"); - } - - int lineCount = 0; - while (true) { - try { - readJournalLine(reader.readLine()); - lineCount++; - } catch (EOFException endOfJournal) { - break; - } - } - redundantOpCount = lineCount - lruEntries.size(); - } finally { - Util.closeQuietly(reader); - } - } - - private void readJournalLine(String line) throws IOException { - int firstSpace = line.indexOf(' '); - if (firstSpace == -1) { - throw new IOException("unexpected journal line: " + line); - } - - int keyBegin = firstSpace + 1; - int secondSpace = line.indexOf(' ', keyBegin); - final String key; - if (secondSpace == -1) { - key = line.substring(keyBegin); - if (firstSpace == REMOVE.length() && line.startsWith(REMOVE)) { - lruEntries.remove(key); - return; - } - } else { - key = line.substring(keyBegin, secondSpace); - } - - Entry entry = lruEntries.get(key); - if (entry == null) { - entry = new Entry(key); - lruEntries.put(key, entry); - } - - if (secondSpace != -1 && firstSpace == CLEAN.length() && line.startsWith(CLEAN)) { - String[] parts = line.substring(secondSpace + 1).split(" "); - entry.readable = true; - entry.currentEditor = null; - entry.setLengths(parts); - } else if (secondSpace == -1 && firstSpace == DIRTY.length() && line.startsWith(DIRTY)) { - entry.currentEditor = new Editor(entry); - } else if (secondSpace == -1 && firstSpace == READ.length() && line.startsWith(READ)) { - // This work was already done by calling lruEntries.get(). - } else { - throw new IOException("unexpected journal line: " + line); - } - } - - /** - * Computes the initial size and collects garbage as a part of opening the - * cache. Dirty entries are assumed to be inconsistent and will be deleted. - */ - private void processJournal() throws IOException { - deleteIfExists(journalFileTmp); - for (Iterator i = lruEntries.values().iterator(); i.hasNext(); ) { - Entry entry = i.next(); - if (entry.currentEditor == null) { - for (int t = 0; t < valueCount; t++) { - size += entry.lengths[t]; - fileCount++; - } - } else { - entry.currentEditor = null; - for (int t = 0; t < valueCount; t++) { - deleteIfExists(entry.getCleanFile(t)); - deleteIfExists(entry.getDirtyFile(t)); - } - i.remove(); - } - } - } - - /** - * Creates a new journal that omits redundant information. This replaces the - * current journal if it exists. - */ - private synchronized void rebuildJournal() throws IOException { - if (journalWriter != null) { - journalWriter.close(); - } - - Writer writer = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(journalFileTmp), Util.US_ASCII)); - try { - writer.write(MAGIC); - writer.write("\n"); - writer.write(VERSION_1); - writer.write("\n"); - writer.write(Integer.toString(appVersion)); - writer.write("\n"); - writer.write(Integer.toString(valueCount)); - writer.write("\n"); - writer.write("\n"); - - for (Entry entry : lruEntries.values()) { - if (entry.currentEditor != null) { - writer.write(DIRTY + ' ' + entry.key + '\n'); - } else { - writer.write(CLEAN + ' ' + entry.key + entry.getLengths() + '\n'); - } - } - } finally { - writer.close(); - } - - if (journalFile.exists()) { - renameTo(journalFile, journalFileBackup, true); - } - renameTo(journalFileTmp, journalFile, false); - journalFileBackup.delete(); - - journalWriter = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(journalFile, true), Util.US_ASCII)); - } - - private static void deleteIfExists(File file) throws IOException { - if (file.exists() && !file.delete()) { - throw new IOException(); - } - } - - private static void renameTo(File from, File to, boolean deleteDestination) throws IOException { - if (deleteDestination) { - deleteIfExists(to); - } - if (!from.renameTo(to)) { - throw new IOException(); - } - } - - /** - * Returns a snapshot of the entry named {@code key}, or null if it doesn't - * exist is not currently readable. If a value is returned, it is moved to - * the head of the LRU queue. - */ - public synchronized Snapshot get(String key) throws IOException { - checkNotClosed(); - validateKey(key); - Entry entry = lruEntries.get(key); - if (entry == null) { - return null; - } - - if (!entry.readable) { - return null; - } - - // Open all streams eagerly to guarantee that we see a single published - // snapshot. If we opened streams lazily then the streams could come - // from different edits. - File[] files = new File[valueCount]; - InputStream[] ins = new InputStream[valueCount]; - try { - File file; - for (int i = 0; i < valueCount; i++) { - file = entry.getCleanFile(i); - files[i] = file; - ins[i] = new FileInputStream(file); - } - } catch (FileNotFoundException e) { - // A file must have been deleted manually! - for (int i = 0; i < valueCount; i++) { - if (ins[i] != null) { - Util.closeQuietly(ins[i]); - } else { - break; - } - } - return null; - } - - redundantOpCount++; - journalWriter.append(READ + ' ' + key + '\n'); - if (journalRebuildRequired()) { - executorService.submit(cleanupCallable); - } - - return new Snapshot(key, entry.sequenceNumber, files, ins, entry.lengths); - } - - /** - * Returns an editor for the entry named {@code key}, or null if another - * edit is in progress. - */ - public Editor edit(String key) throws IOException { - return edit(key, ANY_SEQUENCE_NUMBER); - } - - private synchronized Editor edit(String key, long expectedSequenceNumber) throws IOException { - checkNotClosed(); - validateKey(key); - Entry entry = lruEntries.get(key); - if (expectedSequenceNumber != ANY_SEQUENCE_NUMBER && (entry == null - || entry.sequenceNumber != expectedSequenceNumber)) { - return null; // Snapshot is stale. - } - if (entry == null) { - entry = new Entry(key); - lruEntries.put(key, entry); - } else if (entry.currentEditor != null) { - return null; // Another edit is in progress. - } - - Editor editor = new Editor(entry); - entry.currentEditor = editor; - - // Flush the journal before creating files to prevent file leaks. - journalWriter.write(DIRTY + ' ' + key + '\n'); - journalWriter.flush(); - return editor; - } - - /** Returns the directory where this cache stores its data. */ - public File getDirectory() { - return directory; - } - - /** - * Returns the maximum number of bytes that this cache should use to store - * its data. - */ - public synchronized long getMaxSize() { - return maxSize; - } - - /** Returns the maximum number of files that this cache should store */ - public synchronized int getMaxFileCount() { - return maxFileCount; - } - - /** - * Changes the maximum number of bytes the cache can store and queues a job - * to trim the existing store, if necessary. - */ - public synchronized void setMaxSize(long maxSize) { - this.maxSize = maxSize; - executorService.submit(cleanupCallable); - } - - /** - * Returns the number of bytes currently being used to store the values in - * this cache. This may be greater than the max size if a background - * deletion is pending. - */ - public synchronized long size() { - return size; - } - - /** - * Returns the number of files currently being used to store the values in - * this cache. This may be greater than the max file count if a background - * deletion is pending. - */ - public synchronized long fileCount() { - return fileCount; - } - - private synchronized void completeEdit(Editor editor, boolean success) throws IOException { - Entry entry = editor.entry; - if (entry.currentEditor != editor) { - throw new IllegalStateException(); - } - - // If this edit is creating the entry for the first time, every index must have a value. - if (success && !entry.readable) { - for (int i = 0; i < valueCount; i++) { - if (!editor.written[i]) { - editor.abort(); - throw new IllegalStateException("Newly created entry didn't create value for index " + i); - } - if (!entry.getDirtyFile(i).exists()) { - editor.abort(); - return; - } - } - } - - for (int i = 0; i < valueCount; i++) { - File dirty = entry.getDirtyFile(i); - if (success) { - if (dirty.exists()) { - File clean = entry.getCleanFile(i); - dirty.renameTo(clean); - long oldLength = entry.lengths[i]; - long newLength = clean.length(); - entry.lengths[i] = newLength; - size = size - oldLength + newLength; - fileCount++; - } - } else { - deleteIfExists(dirty); - } - } - - redundantOpCount++; - entry.currentEditor = null; - if (entry.readable | success) { - entry.readable = true; - journalWriter.write(CLEAN + ' ' + entry.key + entry.getLengths() + '\n'); - if (success) { - entry.sequenceNumber = nextSequenceNumber++; - } - } else { - lruEntries.remove(entry.key); - journalWriter.write(REMOVE + ' ' + entry.key + '\n'); - } - journalWriter.flush(); - - if (size > maxSize || fileCount > maxFileCount || journalRebuildRequired()) { - executorService.submit(cleanupCallable); - } - } - - /** - * We only rebuild the journal when it will halve the size of the journal - * and eliminate at least 2000 ops. - */ - private boolean journalRebuildRequired() { - final int redundantOpCompactThreshold = 2000; - return redundantOpCount >= redundantOpCompactThreshold // - && redundantOpCount >= lruEntries.size(); - } - - /** - * Drops the entry for {@code key} if it exists and can be removed. Entries - * actively being edited cannot be removed. - * - * @return true if an entry was removed. - */ - public synchronized boolean remove(String key) throws IOException { - checkNotClosed(); - validateKey(key); - Entry entry = lruEntries.get(key); - if (entry == null || entry.currentEditor != null) { - return false; - } - - for (int i = 0; i < valueCount; i++) { - File file = entry.getCleanFile(i); - if (file.exists() && !file.delete()) { - throw new IOException("failed to delete " + file); - } - size -= entry.lengths[i]; - fileCount--; - entry.lengths[i] = 0; - } - - redundantOpCount++; - journalWriter.append(REMOVE + ' ' + key + '\n'); - lruEntries.remove(key); - - if (journalRebuildRequired()) { - executorService.submit(cleanupCallable); - } - - return true; - } - - /** Returns true if this cache has been closed. */ - public synchronized boolean isClosed() { - return journalWriter == null; - } - - private void checkNotClosed() { - if (journalWriter == null) { - throw new IllegalStateException("cache is closed"); - } - } - - /** Force buffered operations to the filesystem. */ - public synchronized void flush() throws IOException { - checkNotClosed(); - trimToSize(); - trimToFileCount(); - journalWriter.flush(); - } - - /** Closes this cache. Stored values will remain on the filesystem. */ - public synchronized void close() throws IOException { - if (journalWriter == null) { - return; // Already closed. - } - for (Entry entry : new ArrayList(lruEntries.values())) { - if (entry.currentEditor != null) { - entry.currentEditor.abort(); - } - } - trimToSize(); - trimToFileCount(); - journalWriter.close(); - journalWriter = null; - } - - private void trimToSize() throws IOException { - while (size > maxSize) { - Map.Entry toEvict = lruEntries.entrySet().iterator().next(); - remove(toEvict.getKey()); - } - } - - private void trimToFileCount() throws IOException { - while (fileCount > maxFileCount) { - Map.Entry toEvict = lruEntries.entrySet().iterator().next(); - remove(toEvict.getKey()); - } - } - - /** - * Closes the cache and deletes all of its stored values. This will delete - * all files in the cache directory including files that weren't created by - * the cache. - */ - public void delete() throws IOException { - close(); - Util.deleteContents(directory); - } - - private void validateKey(String key) { - Matcher matcher = LEGAL_KEY_PATTERN.matcher(key); - if (!matcher.matches()) { - throw new IllegalArgumentException("keys must match regex [a-z0-9_-]{1,64}: " + key); - } - } - - private static String inputStreamToString(InputStream in) throws IOException { - return Util.readFully(new InputStreamReader(in, Util.UTF_8)); - } - - /** A snapshot of the values for an entry. */ - public final class Snapshot implements Closeable { - private final String key; - private final long sequenceNumber; - private File[] files; - private final InputStream[] ins; - private final long[] lengths; - - private Snapshot(String key, long sequenceNumber, File[] files, InputStream[] ins, long[] lengths) { - this.key = key; - this.sequenceNumber = sequenceNumber; - this.files = files; - this.ins = ins; - this.lengths = lengths; - } - - /** - * Returns an editor for this snapshot's entry, or null if either the - * entry has changed since this snapshot was created or if another edit - * is in progress. - */ - public Editor edit() throws IOException { - return DiskLruCache.this.edit(key, sequenceNumber); - } - - /** Returns file with the value for {@code index}. */ - public File getFile(int index) { - return files[index]; - } - - /** Returns the unbuffered stream with the value for {@code index}. */ - public InputStream getInputStream(int index) { - return ins[index]; - } - - /** Returns the string value for {@code index}. */ - public String getString(int index) throws IOException { - return inputStreamToString(getInputStream(index)); - } - - /** Returns the byte length of the value for {@code index}. */ - public long getLength(int index) { - return lengths[index]; - } - - public void close() { - for (InputStream in : ins) { - Util.closeQuietly(in); - } - } - } - - private static final OutputStream NULL_OUTPUT_STREAM = new OutputStream() { - @Override - public void write(int b) throws IOException { - // Eat all writes silently. Nom nom. - } - }; - - /** Edits the values for an entry. */ - public final class Editor { - private final Entry entry; - private final boolean[] written; - private boolean hasErrors; - private boolean committed; - - private Editor(Entry entry) { - this.entry = entry; - this.written = (entry.readable) ? null : new boolean[valueCount]; - } - - /** - * Returns an unbuffered input stream to read the last committed value, - * or null if no value has been committed. - */ - public InputStream newInputStream(int index) throws IOException { - synchronized (DiskLruCache.this) { - if (entry.currentEditor != this) { - throw new IllegalStateException(); - } - if (!entry.readable) { - return null; - } - try { - return new FileInputStream(entry.getCleanFile(index)); - } catch (FileNotFoundException e) { - return null; - } - } - } - - /** - * Returns the last committed value as a string, or null if no value - * has been committed. - */ - public String getString(int index) throws IOException { - InputStream in = newInputStream(index); - return in != null ? inputStreamToString(in) : null; - } - - /** - * Returns a new unbuffered output stream to write the value at - * {@code index}. If the underlying output stream encounters errors - * when writing to the filesystem, this edit will be aborted when - * {@link #commit} is called. The returned output stream does not throw - * IOExceptions. - */ - public OutputStream newOutputStream(int index) throws IOException { - synchronized (DiskLruCache.this) { - if (entry.currentEditor != this) { - throw new IllegalStateException(); - } - if (!entry.readable) { - written[index] = true; - } - File dirtyFile = entry.getDirtyFile(index); - FileOutputStream outputStream; - try { - outputStream = new FileOutputStream(dirtyFile); - } catch (FileNotFoundException e) { - // Attempt to recreate the cache directory. - directory.mkdirs(); - try { - outputStream = new FileOutputStream(dirtyFile); - } catch (FileNotFoundException e2) { - // We are unable to recover. Silently eat the writes. - return NULL_OUTPUT_STREAM; - } - } - return new FaultHidingOutputStream(outputStream); - } - } - - /** Sets the value at {@code index} to {@code value}. */ - public void set(int index, String value) throws IOException { - Writer writer = null; - try { - writer = new OutputStreamWriter(newOutputStream(index), Util.UTF_8); - writer.write(value); - } finally { - Util.closeQuietly(writer); - } - } - - /** - * Commits this edit so it is visible to readers. This releases the - * edit lock so another edit may be started on the same key. - */ - public void commit() throws IOException { - if (hasErrors) { - completeEdit(this, false); - remove(entry.key); // The previous entry is stale. - } else { - completeEdit(this, true); - } - committed = true; - } - - /** - * Aborts this edit. This releases the edit lock so another edit may be - * started on the same key. - */ - public void abort() throws IOException { - completeEdit(this, false); - } - - public void abortUnlessCommitted() { - if (!committed) { - try { - abort(); - } catch (IOException ignored) { - } - } - } - - private class FaultHidingOutputStream extends FilterOutputStream { - private FaultHidingOutputStream(OutputStream out) { - super(out); - } - - @Override public void write(int oneByte) { - try { - out.write(oneByte); - } catch (IOException e) { - hasErrors = true; - } - } - - @Override public void write(byte[] buffer, int offset, int length) { - try { - out.write(buffer, offset, length); - } catch (IOException e) { - hasErrors = true; - } - } - - @Override public void close() { - try { - out.close(); - } catch (IOException e) { - hasErrors = true; - } - } - - @Override public void flush() { - try { - out.flush(); - } catch (IOException e) { - hasErrors = true; - } - } - } - } - - private final class Entry { - private final String key; - - /** Lengths of this entry's files. */ - private final long[] lengths; - - /** True if this entry has ever been published. */ - private boolean readable; - - /** The ongoing edit or null if this entry is not being edited. */ - private Editor currentEditor; - - /** The sequence number of the most recently committed edit to this entry. */ - private long sequenceNumber; - - private Entry(String key) { - this.key = key; - this.lengths = new long[valueCount]; - } - - public String getLengths() throws IOException { - StringBuilder result = new StringBuilder(); - for (long size : lengths) { - result.append(' ').append(size); - } - return result.toString(); - } - - /** Set lengths using decimal numbers like "10123". */ - private void setLengths(String[] strings) throws IOException { - if (strings.length != valueCount) { - throw invalidLengths(strings); - } - - try { - for (int i = 0; i < strings.length; i++) { - lengths[i] = Long.parseLong(strings[i]); - } - } catch (NumberFormatException e) { - throw invalidLengths(strings); - } - } - - private IOException invalidLengths(String[] strings) throws IOException { - throw new IOException("unexpected journal line: " + java.util.Arrays.toString(strings)); - } - - public File getCleanFile(int i) { - return new File(directory, key + i); - } - - public File getDirtyFile(int i) { - return new File(directory, key + i + ".tmp"); - } - } -} diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/DiskLruCacheManager.java b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/DiskLruCacheManager.java index 424c5dce56..e69de29bb2 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/DiskLruCacheManager.java +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/DiskLruCacheManager.java @@ -1,101 +0,0 @@ -package com.mogo.och.taxi.passenger.utils.blur; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.text.TextUtils; - -import java.io.InputStream; -import java.io.OutputStream; -import java.math.BigInteger; -import java.security.MessageDigest; - -/******************************************************************************* - * Description: 用于缓存经过高斯模糊的图片 - * - * Author: Freeman - * - * Date: 2018/9/4 - * - * Copyright: all rights reserved by Freeman. - *******************************************************************************/ -public class DiskLruCacheManager { - - private DiskLruCache diskLruCache; - private static DiskLruCacheManager instance; - - private final int MAX_CACHE_SIZE = 64 * 1024 * 1024; - - private DiskLruCacheManager(Context context) { - try { - diskLruCache = DiskLruCache.open(context.getCacheDir(), 1, 1, - MAX_CACHE_SIZE, Integer.MAX_VALUE); - } catch (Exception e) { - e.printStackTrace(System.err); - } - } - - public static DiskLruCacheManager getInstance(Context context) { - if (instance == null) { - synchronized (DiskLruCacheManager.class) { - if (instance == null) { - instance = new DiskLruCacheManager(context.getApplicationContext()); - } - } - } - - return instance; - } - - public void put(String url, Bitmap bitmap) { - if (TextUtils.isEmpty(url) || bitmap == null || bitmap.isRecycled()) { - return; - } - - try { - DiskLruCache.Editor editor = diskLruCache.edit(getKey(url)); - OutputStream outputStream = editor.newOutputStream(0); - if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)) { - editor.commit(); - } - diskLruCache.flush(); - } catch (Exception e) { - e.printStackTrace(System.err); - } - } - - public Bitmap get(String url) { - try { - DiskLruCache.Snapshot snapshot = diskLruCache.get(getKey(url)); - if (snapshot != null) { - InputStream inputStream = snapshot.getInputStream(0); - return BitmapFactory.decodeStream(inputStream); - } - } catch (Exception e) { - e.printStackTrace(System.err); - } - - return null; - } - - public static String getKey(String url) { - try { - MessageDigest digest = MessageDigest.getInstance("MD5"); - byte[] md5 = digest.digest(url.getBytes()); - BigInteger bigInteger = new BigInteger(1, md5); - return bigInteger.toString(16); - } catch (Exception e) { - e.printStackTrace(System.err); - } - - return null; - } - - public void close() { - try { - diskLruCache.close(); - } catch (Exception e) { - e.printStackTrace(System.err); - } - } -} diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/FastBlurUtil.java b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/FastBlurUtil.java deleted file mode 100644 index bab7819ba1..0000000000 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/FastBlurUtil.java +++ /dev/null @@ -1,241 +0,0 @@ -package com.mogo.och.taxi.passenger.utils.blur; - -import android.graphics.Bitmap; - -/** - * Created by jay on 11/7/15. - */ -public class FastBlurUtil { - - public static Bitmap doBlur(Bitmap sentBitmap, int scaleRadius, int radius) { - - // Stack Blur v1.0 from - // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html - // - // Java Author: Mario Klingemann - // http://incubator.quasimondo.com - // created Feburary 29, 2004 - // Android port : Yahel Bouaziz - // http://www.kayenko.com - // ported april 5th, 2012 - - // This is a compromise between Gaussian Blur and Box blur - // It creates much better looking blurs than Box Blur, but is - // 7x faster than my Gaussian Blur implementation. - // - // I called it Stack Blur because this describes best how this - // filter works internally: it creates a kind of moving stack - // of colors whilst scanning through the image. Thereby it - // just has to add one new block of color to the right side - // of the stack and remove the leftmost color. The remaining - // colors on the topmost layer of the stack are either added on - // or reduced by one, depending on if they are on the right or - // on the left side of the stack. - // - // If you are using this algorithm in your code please add - // the following line: - // - // Stack Blur Algorithm by Mario Klingemann - if (scaleRadius > 0) { - sentBitmap = Bitmap.createScaledBitmap(sentBitmap, sentBitmap.getWidth() / scaleRadius, - sentBitmap.getHeight() / scaleRadius, false); - } - Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); - - if (radius < 1) { - return (null); - } - int w = bitmap.getWidth(); - int h = bitmap.getHeight(); - - int[] pix = new int[w * h]; - bitmap.getPixels(pix, 0, w, 0, 0, w, h); - - int wm = w - 1; - int hm = h - 1; - int wh = w * h; - int div = radius + radius + 1; - - int r[] = new int[wh]; - int g[] = new int[wh]; - int b[] = new int[wh]; - int rsum, gsum, bsum, x, y, i, p, yp, yi, yw; - int vmin[] = new int[Math.max(w, h)]; - - int divsum = (div + 1) >> 1; - divsum *= divsum; - int dv[] = new int[256 * divsum]; - for (i = 0; i < 256 * divsum; i++) { - dv[i] = (i / divsum); - } - - yw = yi = 0; - - int[][] stack = new int[div][3]; - int stackpointer; - int stackstart; - int[] sir; - int rbs; - int r1 = radius + 1; - int routsum, goutsum, boutsum; - int rinsum, ginsum, binsum; - - for (y = 0; y < h; y++) { - rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; - for (i = -radius; i <= radius; i++) { - p = pix[yi + Math.min(wm, Math.max(i, 0))]; - sir = stack[i + radius]; - sir[0] = (p & 0xff0000) >> 16; - sir[1] = (p & 0x00ff00) >> 8; - sir[2] = (p & 0x0000ff); - rbs = r1 - Math.abs(i); - rsum += sir[0] * rbs; - gsum += sir[1] * rbs; - bsum += sir[2] * rbs; - if (i > 0) { - rinsum += sir[0]; - ginsum += sir[1]; - binsum += sir[2]; - } else { - routsum += sir[0]; - goutsum += sir[1]; - boutsum += sir[2]; - } - } - stackpointer = radius; - - for (x = 0; x < w; x++) { - - r[yi] = dv[rsum]; - g[yi] = dv[gsum]; - b[yi] = dv[bsum]; - - rsum -= routsum; - gsum -= goutsum; - bsum -= boutsum; - - stackstart = stackpointer - radius + div; - sir = stack[stackstart % div]; - - routsum -= sir[0]; - goutsum -= sir[1]; - boutsum -= sir[2]; - - if (y == 0) { - vmin[x] = Math.min(x + radius + 1, wm); - } - p = pix[yw + vmin[x]]; - - sir[0] = (p & 0xff0000) >> 16; - sir[1] = (p & 0x00ff00) >> 8; - sir[2] = (p & 0x0000ff); - - rinsum += sir[0]; - ginsum += sir[1]; - binsum += sir[2]; - - rsum += rinsum; - gsum += ginsum; - bsum += binsum; - - stackpointer = (stackpointer + 1) % div; - sir = stack[(stackpointer) % div]; - - routsum += sir[0]; - goutsum += sir[1]; - boutsum += sir[2]; - - rinsum -= sir[0]; - ginsum -= sir[1]; - binsum -= sir[2]; - - yi++; - } - yw += w; - } - for (x = 0; x < w; x++) { - rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; - yp = -radius * w; - for (i = -radius; i <= radius; i++) { - yi = Math.max(0, yp) + x; - - sir = stack[i + radius]; - - sir[0] = r[yi]; - sir[1] = g[yi]; - sir[2] = b[yi]; - - rbs = r1 - Math.abs(i); - - rsum += r[yi] * rbs; - gsum += g[yi] * rbs; - bsum += b[yi] * rbs; - - if (i > 0) { - rinsum += sir[0]; - ginsum += sir[1]; - binsum += sir[2]; - } else { - routsum += sir[0]; - goutsum += sir[1]; - boutsum += sir[2]; - } - - if (i < hm) { - yp += w; - } - } - yi = x; - stackpointer = radius; - for (y = 0; y < h; y++) { - // Preserve alpha channel: ( 0xff000000 & pix[yi] ) - pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum]; - - rsum -= routsum; - gsum -= goutsum; - bsum -= boutsum; - - stackstart = stackpointer - radius + div; - sir = stack[stackstart % div]; - - routsum -= sir[0]; - goutsum -= sir[1]; - boutsum -= sir[2]; - - if (x == 0) { - vmin[y] = Math.min(y + r1, hm) * w; - } - p = x + vmin[y]; - - sir[0] = r[p]; - sir[1] = g[p]; - sir[2] = b[p]; - - rinsum += sir[0]; - ginsum += sir[1]; - binsum += sir[2]; - - rsum += rinsum; - gsum += ginsum; - bsum += binsum; - - stackpointer = (stackpointer + 1) % div; - sir = stack[stackpointer]; - - routsum += sir[0]; - goutsum += sir[1]; - boutsum += sir[2]; - - rinsum -= sir[0]; - ginsum -= sir[1]; - binsum -= sir[2]; - - yi += w; - } - } - - bitmap.setPixels(pix, 0, w, 0, 0, w, h); - - return (bitmap); - } -} diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/GlideBlurTransform.java b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/GlideBlurTransform.java deleted file mode 100644 index de5dd4d9e8..0000000000 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/GlideBlurTransform.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.mogo.och.taxi.passenger.utils.blur; - -import android.content.Context; -import android.graphics.Bitmap; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; -import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; - -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; - -public class GlideBlurTransform extends BitmapTransformation { - - private String key; - private int blurRadius; - - public GlideBlurTransform(String key, int blurRadius) { - this.key = key; - this.blurRadius = blurRadius; - } - - @Override - protected Bitmap transform( @NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight ) { - Bitmap bitmap = FastBlurUtil.doBlur( toTransform, 1, blurRadius ); - return bitmap; - } - - @Override - public boolean equals(@Nullable Object obj) { - if (obj instanceof GlideBlurTransform) { - return ((GlideBlurTransform) obj).key.equals(key); - } - return false; - } - - @Override - public int hashCode() { - return key.hashCode(); - } - - @Override - public void updateDiskCacheKey( MessageDigest messageDigest ) { - messageDigest.update(key.getBytes(StandardCharsets.UTF_8)); - } -} \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/StrictLineReader.java b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/StrictLineReader.java deleted file mode 100644 index 94f756e38b..0000000000 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/StrictLineReader.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.mogo.och.taxi.passenger.utils.blur; - -import java.io.ByteArrayOutputStream; -import java.io.Closeable; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; - -/** - * Buffers input from an {@link InputStream} for reading lines. - * - *

This class is used for buffered reading of lines. For purposes of this class, a line ends - * with "\n" or "\r\n". End of input is reported by throwing {@code EOFException}. Unterminated - * line at end of input is invalid and will be ignored, the caller may use {@code - * hasUnterminatedLine()} to detect it after catching the {@code EOFException}. - * - *

This class is intended for reading input that strictly consists of lines, such as line-based - * cache entries or cache journal. Unlike the {@link java.io.BufferedReader} which in conjunction - * with {@link java.io.InputStreamReader} provides similar functionality, this class uses different - * end-of-input reporting and a more restrictive definition of a line. - * - *

This class supports only charsets that encode '\r' and '\n' as a single byte with value 13 - * and 10, respectively, and the representation of no other character contains these values. - * We currently check in constructor that the charset is one of US-ASCII, UTF-8 and ISO-8859-1. - * The default charset is US_ASCII. - */ -class StrictLineReader implements Closeable { - private static final byte CR = (byte) '\r'; - private static final byte LF = (byte) '\n'; - - private final InputStream in; - private final Charset charset; - - /* - * Buffered data is stored in {@code buf}. As long as no exception occurs, 0 <= pos <= end - * and the data in the range [pos, end) is buffered for reading. At end of input, if there is - * an unterminated line, we set end == -1, otherwise end == pos. If the underlying - * {@code InputStream} throws an {@code IOException}, end may remain as either pos or -1. - */ - private byte[] buf; - private int pos; - private int end; - - /** - * Constructs a new {@code LineReader} with the specified charset and the default capacity. - * - * @param in the {@code InputStream} to read data from. - * @param charset the charset used to decode data. Only US-ASCII, UTF-8 and ISO-8859-1 are - * supported. - * @throws NullPointerException if {@code in} or {@code charset} is null. - * @throws IllegalArgumentException if the specified charset is not supported. - */ - public StrictLineReader(InputStream in, Charset charset) { - this(in, 8192, charset); - } - - /** - * Constructs a new {@code LineReader} with the specified capacity and charset. - * - * @param in the {@code InputStream} to read data from. - * @param capacity the capacity of the buffer. - * @param charset the charset used to decode data. Only US-ASCII, UTF-8 and ISO-8859-1 are - * supported. - * @throws NullPointerException if {@code in} or {@code charset} is null. - * @throws IllegalArgumentException if {@code capacity} is negative or zero - * or the specified charset is not supported. - */ - public StrictLineReader(InputStream in, int capacity, Charset charset) { - if (in == null || charset == null) { - throw new NullPointerException(); - } - if (capacity < 0) { - throw new IllegalArgumentException("capacity <= 0"); - } - if (!(charset.equals(Util.US_ASCII))) { - throw new IllegalArgumentException("Unsupported encoding"); - } - - this.in = in; - this.charset = charset; - buf = new byte[capacity]; - } - - /** - * Closes the reader by closing the underlying {@code InputStream} and - * marking this reader as closed. - * - * @throws IOException for errors when closing the underlying {@code InputStream}. - */ - public void close() throws IOException { - synchronized (in) { - if (buf != null) { - buf = null; - in.close(); - } - } - } - - /** - * Reads the next line. A line ends with {@code "\n"} or {@code "\r\n"}, - * this end of line marker is not included in the result. - * - * @return the next line from the input. - * @throws IOException for underlying {@code InputStream} errors. - * @throws EOFException for the end of source stream. - */ - public String readLine() throws IOException { - synchronized (in) { - if (buf == null) { - throw new IOException("LineReader is closed"); - } - - // Read more data if we are at the end of the buffered data. - // Though it's an error to read after an exception, we will let {@code fillBuf()} - // throw again if that happens; thus we need to handle end == -1 as well as end == pos. - if (pos >= end) { - fillBuf(); - } - // Try to find LF in the buffered data and return the line if successful. - for (int i = pos; i != end; ++i) { - if (buf[i] == LF) { - int lineEnd = (i != pos && buf[i - 1] == CR) ? i - 1 : i; - String res = new String(buf, pos, lineEnd - pos, charset.name()); - pos = i + 1; - return res; - } - } - - // Let's anticipate up to 80 characters on top of those already read. - ByteArrayOutputStream out = new ByteArrayOutputStream(end - pos + 80) { - @Override - public String toString() { - int length = (count > 0 && buf[count - 1] == CR) ? count - 1 : count; - try { - return new String(buf, 0, length, charset.name()); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(e); // Since we control the charset this will never happen. - } - } - }; - - while (true) { - out.write(buf, pos, end - pos); - // Mark unterminated line in case fillBuf throws EOFException or IOException. - end = -1; - fillBuf(); - // Try to find LF in the buffered data and return the line if successful. - for (int i = pos; i != end; ++i) { - if (buf[i] == LF) { - if (i != pos) { - out.write(buf, pos, i - pos); - } - pos = i + 1; - return out.toString(); - } - } - } - } - } - - /** - * Reads new input data into the buffer. Call only with pos == end or end == -1, - * depending on the desired outcome if the function throws. - */ - private void fillBuf() throws IOException { - int result = in.read(buf, 0, buf.length); - if (result == -1) { - throw new EOFException(); - } - pos = 0; - end = result; - } -} - diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/Util.java b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/Util.java deleted file mode 100644 index 05f0c2e994..0000000000 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/utils/blur/Util.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.mogo.och.taxi.passenger.utils.blur; - -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.Reader; -import java.io.StringWriter; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -/** Junk drawer of utility methods. */ -final class Util { - static final Charset US_ASCII = StandardCharsets.US_ASCII; - static final Charset UTF_8 = StandardCharsets.UTF_8; - - private Util() { - } - - static String readFully(Reader reader) throws IOException { - try { - StringWriter writer = new StringWriter(); - char[] buffer = new char[1024]; - int count; - while ((count = reader.read(buffer)) != -1) { - writer.write(buffer, 0, count); - } - return writer.toString(); - } finally { - reader.close(); - } - } - - /** - * Deletes the contents of {@code dir}. Throws an IOException if any file - * could not be deleted, or if {@code dir} is not a readable directory. - */ - static void deleteContents(File dir) throws IOException { - File[] files = dir.listFiles(); - if (files == null) { - throw new IOException("not a readable directory: " + dir); - } - for (File file : files) { - if (file.isDirectory()) { - deleteContents(file); - } - if (!file.delete()) { - throw new IOException("failed to delete file: " + file); - } - } - } - - static void closeQuietly(/*Auto*/Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (RuntimeException rethrown) { - throw rethrown; - } catch (Exception ignored) { - } - } - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.kt index 50dad60f3c..02576728fa 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.kt @@ -72,12 +72,12 @@ class TaxiPassengerBaseFragment() : overMapView.onCreateView(savedInstanceState) overMapView.hideResetView() - createProgressDialogAnim = FrameAnimatorContainer(R.array.xiaozhi_normal, 20,aciv_xiaozhi_normal) - createProgressDialogAnim?.setOnAnimStopListener(object : FrameAnimatorContainer.OnAnimationStoppedListener{ - override fun AnimationStopped() { - CallerLogger.d(M_TAXI_P + TAG, "动画暂停") - } - }) +// createProgressDialogAnim = FrameAnimatorContainer(R.array.xiaozhi_normal, 20,aciv_xiaozhi_normal) +// createProgressDialogAnim?.setOnAnimStopListener(object : FrameAnimatorContainer.OnAnimationStoppedListener{ +// override fun AnimationStopped() { +// CallerLogger.d(M_TAXI_P + TAG, "动画暂停") +// } +// }) } private fun initListener() { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt index 336357d774..655a132350 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt @@ -5,7 +5,6 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.drawable.BitmapDrawable import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.function.api.autopilot.IMoGoBackCameraVideoListener @@ -128,7 +127,7 @@ class RightRearCamView : ConstraintLayout , IMoGoBackCameraVideoListener, private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int { val width = options.outWidth val height = options.outHeight - Log.i(TAG, "calculateInSampleSize: out width and height is $width height $height") + d(SceneConstant.M_TAXI_P + TAG, "calculateInSampleSize: out width and height is $width height $height") var inSampleWidth = 1 if (height > reqHeight || width > reqWidth) { val halfHeight = height / 2 diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_base_fragment.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_base_fragment.xml index a8651e879a..4dbc188d3e 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_base_fragment.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_base_fragment.xml @@ -148,7 +148,7 @@ android:layout_height="@dimen/dp_160" app:layout_constraintBottom_toBottomOf="parent" /> - 100) { diff --git a/build.gradle b/build.gradle index 190f5f0714..214e6b777c 100644 --- a/build.gradle +++ b/build.gradle @@ -15,13 +15,9 @@ buildscript { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://maven.aliyun.com/repository/jcenter' } - - maven { - url "https://artifact.bytedance.com/repository/Volcengine/" - } - maven { - url "https://artifact.bytedance.com/repository/byteX/" - } + maven { url "https://plugins.gradle.org/m2/" } + maven { url "https://artifact.bytedance.com/repository/Volcengine/" } + maven { url "https://artifact.bytedance.com/repository/byteX/" } gradlePluginPortal() // mavenCentral() google() @@ -34,13 +30,14 @@ buildscript { classpath "com.mogo.cloud:hook:${service_chain_version}" classpath "com.mogo.cloud:bizconfig:${plugin_version}" classpath 'com.volcengine:apm_insight_plugin:1.4.2' - classpath "com.mogo.thread.opt:plg:10.2.1_mogo" + classpath "com.mogo.thread.opt:plg:10.10.0" classpath "com.mogo.cloud:systrace:${plugin_version}" classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath "com.mogo.sticky:service:${plugin_version}" classpath "io.github.knight-zxw:lancet-plugin:${lancetx_plugin_version}" classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0" classpath 'com.mogo.cloud:matrix:1.0.0' + classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513' // classpath 'com.bytedance.btrace:rhea-gradle-plugin:2.0.0' } // 遇无法更新依赖情况(针对Snapshot无法刷新)然后sync project即可,刷新完成注释该代码 @@ -62,6 +59,7 @@ allprojects { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://maven.aliyun.com/repository/jcenter' } + maven { url 'https://plugins.gradle.org/m2/' } // mavenCentral() maven { @@ -73,7 +71,7 @@ allprojects { google() } - if (isCodeInspectEnable ) { + if (isCodeInspectEnable) { def basePath = new File(codequality, 'code_inspect_increment.gradle').path apply from: "$basePath" def pmdPath = new File(codequality, 'pmd.gradle').path @@ -85,6 +83,9 @@ allprojects { } } +apply plugin: 'jacoco' +apply from: rootProject.file('codequality/sonar.gradle') + task clean(type: Delete) { delete rootProject.buildDir } diff --git a/codequality/sonar.gradle b/codequality/sonar.gradle new file mode 100644 index 0000000000..94030dde8a --- /dev/null +++ b/codequality/sonar.gradle @@ -0,0 +1,19 @@ +apply plugin: 'org.sonarqube' + +sonarqube { + properties { + property "sonar.log.level", "TRACE" + property "sonar.sourceEncoding", "UTF-8" + property "sonar.projectKey", "MoGoEagleEyeTest" + property "sonar.sources", "src/main/java" + property "sonar.binaries", "build/intermediates/classes" + property "sonar.qualitygate.wait", true + property "sonar.android.lint.report", false + property "sonar.scm.exclusions.disabled", false + property "sonar.scm.exclusions.file", "**/.gitignore" + property "sonar.exclusions", "**/AndroidManifest.xml, **/src/test/**, com/mogo/eagle/core/utilcode, **/*.jar, **/*.aar, **/*.war, **/*.ear, **/*.rar, **/*.tgz, **/*.zip, **/src/test/java/**/*.java, **/src/test/java/**/*.kt, **/test/**/*, **/*Test.java, **/*Tests.java, **/*Test.kt, **/*.xml,*.xml, **/target/**, **/src/main/java/proto/**, **/build/**, build, build/**, **/db/dao/*.java, **/build/intermediates/**/*" +// property "sonar.java.coveragePlugin", "jacoco" +// property("sonar.coverage.jacoco.xmlReportPaths", "../../build/reports/jacocoTestReport.xml,../build/reports/jacocoTestReport.xml") + } +} + diff --git a/config.gradle b/config.gradle index 108f48c3d8..449a94ec7c 100644 --- a/config.gradle +++ b/config.gradle @@ -157,8 +157,6 @@ ext { mogoaicloudpassport : "com.mogo.cloud:passport:${MOGO_PASSPORT_VERSION}", mogoaicloudnetwork : "com.mogo.cloud:network:${MOGO_NETWORK_VERSION}", mogoaicloudlive : "com.mogo.cloud:live:${MOGO_LIVE_VERSION}", - mogoaicloudrealtime : "com.mogo.cloud:realtime:${MOGO_REALTIME_VERSION}", - mogoaicloudtanlu : "com.mogo.cloud:tanlu:${MOGO_TANLU_VERSION}", mogoaicloudtrafficlive : "com.mogo.cloud:trafficlive:${MOGO_TRAFFICLIVE_VERSION}", mogoaicloudlocation : "com.mogo.cloud:location:${MOGO_LOCATION_VERSION}", mogoaicloudtelematic : "com.mogo.cloud:telematic:${MOGO_TELEMATIC_VERSION}", @@ -215,13 +213,13 @@ ext { //========================= autosize ====================== androidautoSize : 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1', - thread_opt : "com.mogo.thread.opt:lib:10.2.1_mogo", + thread_opt : "com.mogo.thread.opt:lib:10.10.2", weak_network : "com.mogo.weak:network:1.0.1", btrace : "com.bytedance.btrace:rhea-core:2.0.0", mofang_runtime : "com.mogo.eagle.core.mofang:runtime:2.0.7", - log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.15", + log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.20", // 安全证书 passport_secret : "com.zhidaoauto:sdk-java:1.0.5-SNAPSHOT", @@ -240,6 +238,6 @@ ext { ] } -boolean isM1Chip() { +static boolean isM1Chip() { return System.getProperty("os.name").contains("Mac") && System.getProperty("os.arch") == "aarch64" } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/DispatchAutoPilotManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/DispatchAutoPilotManager.kt index 38f79472f2..997fdb61a0 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/DispatchAutoPilotManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/DispatchAutoPilotManager.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.function.biz.dispatch import android.content.Context import android.os.Handler +import android.os.Looper import android.os.Message import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager @@ -9,6 +10,7 @@ import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo import com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBean +import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener @@ -31,11 +33,12 @@ import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Compani import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Companion.DISPATCH_STOP_MANUAL_CANCEL import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Companion.DISPATCH_STOP_TIMER_CANCEL import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Companion.dispatchServiceModel +import com.mogo.eagle.function.biz.v2x.V2XBizTrace import com.zhjt.mogo.adas.data.bean.MogoReport +import com.zhjt.service.chain.ChainLog import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg -//todo emArrow 添加biz链路日志 //负责监听自动驾驶状态并进行状态上报,自动驾驶路线上报,接收调度指令展示指令弹窗 class DispatchAutoPilotManager private constructor() : IMogoOnMessageListener, @@ -61,7 +64,7 @@ class DispatchAutoPilotManager private constructor() : private var isDispatch = false private var isArriveEnd = false - private val handler: Handler = object : Handler() { + private val handler: Handler = object : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message) { super.handleMessage(msg) if (msg.what == MSG_TYPE_SHOW_DIALOG) { @@ -109,6 +112,12 @@ class DispatchAutoPilotManager private constructor() : return DispatchAdasAutoPilotLocReceiverBean::class.java } + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, + nodeAliasCode = ChainConstant.CHAIN_CODE_DISPATCH_RECEIVE, + paramIndexes = [0] + ) override fun onMsgReceived(adasAutoPilotLocReceiverBean: DispatchAdasAutoPilotLocReceiverBean?) { CallerLogger.i("$M_BIZ$TAG","onMsgReceived 收到云调度长链接, adasAutoPilotLocReceiver:${adasAutoPilotLocReceiverBean?:""}") if (adasAutoPilotLocReceiverBean != null && adasAutoPilotLocReceiverBean.startLat != 0.0 && adasAutoPilotLocReceiverBean.startLon != 0.0) { @@ -130,6 +139,12 @@ class DispatchAutoPilotManager private constructor() : } } + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, + nodeAliasCode = ChainConstant.CHAIN_CODE_DISPATCH_START, + paramIndexes = [-1] + ) private fun startAutoPilot() { val currentAutopilot = AutopilotControlParameters() // currentAutopilot.isSpeakVoice = false @@ -146,34 +161,42 @@ class DispatchAutoPilotManager private constructor() : } } if(it.trajUrl == null){ + V2XBizTrace.onAck(M_BIZ + TAG, "trajUrl-null") ToastUtils.showShort("trajUrl数据为空") return } if(it.trajMd5 == null){ + V2XBizTrace.onAck(M_BIZ + TAG, "trajMd5-null") ToastUtils.showShort("trajMd5数据为空") return } if(it.stopUrl == null){ + V2XBizTrace.onAck(M_BIZ + TAG, "stopUrl-null") ToastUtils.showShort("stopUrl数据为空") return } if(it.stopMd5 == null){ + V2XBizTrace.onAck(M_BIZ + TAG, "stopMd5-null") ToastUtils.showShort("stopMd5数据为空") return } if(it.vehicleModel == null){ + V2XBizTrace.onAck(M_BIZ + TAG, "vehicleModel-null") ToastUtils.showShort("vehicleModel数据为空") return } if(it.lineName == null){ + V2XBizTrace.onAck(M_BIZ + TAG, "lineName-null") ToastUtils.showShort("lineName数据为空") return } if(it.startLocAddress == null){ + V2XBizTrace.onAck(M_BIZ + TAG, "startLocAddress-null") ToastUtils.showShort("startLocAddress数据为空") return } if(it.endLocAddress == null){ + V2XBizTrace.onAck(M_BIZ + TAG, "endLocAddress-null") ToastUtils.showShort("endLocAddress数据为空") return } @@ -191,7 +214,7 @@ class DispatchAutoPilotManager private constructor() : currentAutopilot.endLatLon = AutopilotControlParameters.AutoPilotLonLat(it.endLat, it.endLon) currentAutopilot.vehicleType = 10 - CallerLogger.d(M_BIZ + TAG, "开启自动驾驶====$currentAutopilot") + V2XBizTrace.onAck(M_BIZ + TAG, "开启自动驾驶====$currentAutopilot") CallerAutoPilotControlManager.startAutoPilot(currentAutopilot) } } @@ -213,6 +236,7 @@ class DispatchAutoPilotManager private constructor() : * 停止调度确认 */ fun stopAffirm(){ + V2XBizTrace.onAck(M_BIZ + TAG,"stopAffirm") CallerHmiManager.dismissDispatchDialog() receiverBean?.taskId?.let{ dispatchServiceModel.dispatchResultUpload(DISPATCH_STOP_AFFIRM, it, @@ -230,6 +254,7 @@ class DispatchAutoPilotManager private constructor() : } fun cancel(manualTrigger: Boolean) { + V2XBizTrace.onAck(M_BIZ + TAG,"cancel") CallerHmiManager.dismissDispatchDialog() receiverBean?.taskId?.let { dispatchServiceModel.dispatchResultUpload( @@ -241,6 +266,7 @@ class DispatchAutoPilotManager private constructor() : * 停止调度取消 */ fun stopCancel(manualTrigger: Boolean){ + V2XBizTrace.onAck(M_BIZ + TAG,"stopCancel:$manualTrigger") CallerHmiManager.dismissDispatchDialog() receiverBean?.taskId?.let{ dispatchServiceModel.dispatchResultUpload( @@ -263,9 +289,6 @@ class DispatchAutoPilotManager private constructor() : if (isArriveEnd) { return } - //todo 确认是否要根据停靠时自动驾驶状态,再次开启自动驾驶 - // 确保处于调度中并且返回的自动驾驶状态为1才开启自动驾驶 - // 上述等待鄂州项目复盘后,产品输出完成方案后再进操作!!! if (isDispatch) { startAutoPilot() } @@ -324,6 +347,8 @@ class DispatchAutoPilotManager private constructor() : //语音提示到站 AIAssist.getInstance(mContext).speakTTSVoice("云调度完成,车辆已到达${it.endLocAddress}") } + }else{ + V2XBizTrace.onAck(M_BIZ + TAG, mapOf("ArriveAtStation" to arrivalNotification, "distanceFromSelf" to distanceFromSelf)) } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/notice/network/NoticeNetWorkManager.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/notice/network/NoticeNetWorkManager.java index 6b92808023..946f602fc8 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/notice/network/NoticeNetWorkManager.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/notice/network/NoticeNetWorkManager.java @@ -30,7 +30,6 @@ import okhttp3.RequestBody; * @since: 10/28/21 */ public class NoticeNetWorkManager { - private static volatile NoticeNetWorkManager requestNoticeManager; private final INoticeApiService mNoticeApiService; private NoticeNetWorkManager() { @@ -39,14 +38,11 @@ public class NoticeNetWorkManager { } public static NoticeNetWorkManager getInstance() { - if (requestNoticeManager == null) { - synchronized (NoticeNetWorkManager.class) { - if (requestNoticeManager == null) { - requestNoticeManager = new NoticeNetWorkManager(); - } - } - } - return requestNoticeManager; + return Holder.requestNoticeManager; + } + + private static final class Holder{ + private static final NoticeNetWorkManager requestNoticeManager = new NoticeNetWorkManager(); } /** @@ -88,7 +84,7 @@ public class NoticeNetWorkManager { * 反馈交警是否接受事故任务 * * @param infoId 事故id - * @param sn + * @param sn sn * @param status 是否接受 0否 1是 */ public void sendAccidentAcceptStatus(String infoId, String sn, int status) { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/obu/V2xObuEventManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/obu/V2xObuEventManager.kt index 8dd062988f..9b708319ed 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/obu/V2xObuEventManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/obu/V2xObuEventManager.kt @@ -11,6 +11,7 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.obu.CallerObuSaveMessageListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.function.biz.v2x.V2XBizTrace import com.mogo.eagle.function.biz.v2x.v2n.utils.V2XEventAnalyticsManager /** @@ -53,7 +54,7 @@ object V2xObuEventManager : IMoGoObuSaveMessageListener { } } obuDataMap[type] = System.currentTimeMillis() - CallerLogger.d("${SceneConstant.M_OBU}${TAG}", "onMoGoObuSaveMessage type = $type ---content = $content ---tts = $tts ") + V2XBizTrace.onAck("${SceneConstant.M_OBU}${TAG}", mapOf("type" to type,"content" to content,"tts" to tts)) CallerMsgBoxManager.saveMsgBox( MsgBoxBean( MsgBoxType.V2X, diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/redlightwarning/RedLightWarningManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/redlightwarning/RedLightWarningManager.kt index 9beb4fd4fb..f1d97cce21 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/redlightwarning/RedLightWarningManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/redlightwarning/RedLightWarningManager.kt @@ -1,6 +1,5 @@ package com.mogo.eagle.function.biz.v2x.redlightwarning -import android.util.Log import com.mogo.eagle.core.data.biz.trafficlight.* import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP_GREEN @@ -235,9 +234,6 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType), speed ) - if (content.isEmpty() || tts.isEmpty()) { - Log.d("MsgBox-RedLightWarManaG", "alertContent或ttsContent为空!") - } CallerMsgBoxManager.saveMsgBox( MsgBoxBean( MsgBoxType.V2X, diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt index 153d7b0762..0732986068 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt @@ -7,6 +7,7 @@ import androidx.annotation.* import androidx.localbroadcastmanager.content.* import com.mogo.eagle.core.data.config.* import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_V2X_MSG +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_ADAS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_CLOUD import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_V2X import com.mogo.eagle.core.data.enums.* @@ -182,7 +183,7 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, @RequiresApi(Build.VERSION_CODES.N) @ChainLog( linkChainLog = CHAIN_TYPE_V2X, - linkCode = CHAIN_SOURCE_CLOUD, + linkCode = CHAIN_SOURCE_ADAS, nodeAliasCode = CHAIN_CODE_V2X_MSG, paramIndexes = [0] ) @@ -301,6 +302,7 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, val msgBoxBean = MsgBoxBean(MsgBoxType.V2X, V2XMsg("", "查询到当前全程共${count}个事件", "",CommunicationType.V2N.name)) msgBoxBean.sourceType = DataSourceType.SUMMARY + V2XBizTrace.onAck("$M_V2X$TAG", mapOf("v2xEventsSummary" to msgBoxBean)) CallerMsgBoxManager.saveMsgBox(msgBoxBean) //消息埋点 V2XEventAnalyticsManager.triggerV2XEvent("summary","查询到当前全程共${count}个事件", diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XPoiLoader.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XPoiLoader.kt index f1b96ff6f1..1835084bda 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XPoiLoader.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XPoiLoader.kt @@ -12,7 +12,9 @@ import com.mogo.eagle.core.data.v2x.V2XEvent import com.mogo.eagle.core.data.v2x.V2XMarkerResponse import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.eagle.function.biz.v2x.V2XBizTrace import com.mogo.eagle.function.biz.v2x.v2n.network.V2XRefreshModel import com.mogo.eagle.function.biz.v2x.v2n.network.callback.IV2XCallback import com.mogo.eagle.function.biz.v2x.v2n.network.callback.IV2XRefreshCallback @@ -160,6 +162,7 @@ class V2XPoiLoader private constructor() { val msgBoxBean = MsgBoxBean(MsgBoxType.V2X, V2XMsg("", "查询到当前全程共${size}个事件", "",CommunicationType.V2N.name)) msgBoxBean.sourceType = DataSourceType.SUMMARY + V2XBizTrace.onAck("${SceneConstant.M_V2X}$TAG", mapOf("v2xEventsSummary" to msgBoxBean)) CallerMsgBoxManager.saveMsgBox(msgBoxBean) //消息埋点 V2XEventAnalyticsManager.triggerV2XEvent("summary","查询到当前全程共${size}个事件", diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index b2d02ed02c..82d0486c8d 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -17,7 +17,6 @@ import com.mogo.eagle.core.function.call.hmi.* import com.mogo.eagle.core.function.call.map.* import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox import com.mogo.eagle.core.utilcode.mogo.* -import com.mogo.eagle.core.utilcode.mogo.logger.* import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.function.biz.v2x.V2XBizTrace import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.* @@ -33,7 +32,6 @@ import mogo.v2x.MogoV2X.RSI_PB */ internal object V2NIdentifyDrawer { - private const val TAG = "V2NIdentifyDataSubscriber" private const val MSG_WHAT_DRAW_SHIGONE = 0x1010 // 道路施工 @@ -44,6 +42,7 @@ internal object V2NIdentifyDrawer { if (msg.what == MSG_WHAT_DRAW_SHIGONE || msg.what == MSG_WHAT_DRAW_SHIGU) { val events = msg.obj as? List<*> if (events == null || events.isEmpty()) { + V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu" to "")) return@Callback true } val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() @@ -51,6 +50,7 @@ internal object V2NIdentifyDrawer { DrivingDirectionUtils.getDegreeOfCar2Poi(car.longitude, car.latitude, itx.longitude, itx.latitude, car.heading.toInt()) < 90 } if (filtered.isEmpty()) { + V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu-filter" to "")) return@Callback true } filtered.forEach { itx -> @@ -78,7 +78,7 @@ internal object V2NIdentifyDrawer { val distance = CoordinateUtils.calculateLineDistance(itx.longitude, itx.latitude, car.longitude, car.latitude) val alertContent = getAlertContent(poiType, distance.toDouble()) val ttsContent = getTtsContent(poiType, distance.toDouble()) - V2XBizTrace.onAck("V2NIdentifyDrawer","绘制poi事件:$poiType") + V2XBizTrace.onAck(TAG,"绘制poi事件:$poiType") saveMsgBox(MsgBoxBean(V2X, V2XMsg(poiType, alertContent, ttsContent,CommunicationType.V2N.name))) CallerHmiManager.warningV2X(poiType, alertContent, ttsContent, object : IMoGoWarningStatusListener { override fun onShow() { @@ -100,6 +100,7 @@ internal object V2NIdentifyDrawer { } else if (msg.what == MSG_WHAT_DRAW_YONGDU) { val events = msg.obj as? List<*> if (events == null || events.isEmpty()) { + V2XBizTrace.onAck(TAG, mapOf("yongDu" to "")) return@Callback true } val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() @@ -109,6 +110,7 @@ internal object V2NIdentifyDrawer { DrivingDirectionUtils.getDegreeOfCar2Poi(car.longitude, car.latitude, eventLon, eventLat, car.heading.toInt()) < 90 } if (filtered.isEmpty()) { + V2XBizTrace.onAck(TAG, mapOf("yongDu-filter" to "")) return@Callback true } filtered.forEach { itx -> @@ -137,6 +139,7 @@ internal object V2NIdentifyDrawer { val distance = CoordinateUtils.calculateLineDistance(lon, lat, car.longitude, car.latitude) val alertContent = getAlertContent(poiType, distance.toDouble()) val ttsContent = getTtsContent(poiType, distance.toDouble()) + V2XBizTrace.onAck(TAG,"绘制poi事件:$poiType") saveMsgBox(MsgBoxBean(V2X, V2XMsg(poiType, alertContent, ttsContent,CommunicationType.V2N.name))) CallerHmiManager.warningV2X(poiType, alertContent, ttsContent, object : IMoGoWarningStatusListener { override fun onShow() { @@ -221,7 +224,6 @@ internal object V2NIdentifyDrawer { override fun onAutopilotV2nCongestionEvent(header: Header, rsi: RSI_PB) { super.onAutopilotV2nCongestionEvent(header, rsi) - Logger.d(TAG, "--- onAutopilotV2nCongestionEvent -- : rsi: ${ GsonUtils.toJson(rsi) }") try { V2XBizTrace.onAck("onAutopilotV2nCongestionEvent", rsi) } catch (t: Throwable) { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt index 68f996cfd0..82a986e606 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt @@ -101,7 +101,7 @@ class AiRoadMarker { 300f, call = { result -> //施工中心点后方的自车行驶方向上300米距离 result?.let { - V2XBizTrace.onAck("$TAG --- marker --- 3 --- l1:", it) + V2XBizTrace.onAck("$TAG -marker-3-l1:", it) l1 = result } countDown.incrementAndGet() @@ -113,7 +113,7 @@ class AiRoadMarker { location.heading.toFloat(), -300f, call = { result -> result?.let { - V2XBizTrace.onAck("$TAG --- marker --- 3 --- l2:", it) + V2XBizTrace.onAck("$TAG -marker-3-l2:", it) l2 = result } countDown.incrementAndGet() @@ -136,14 +136,14 @@ class AiRoadMarker { return@post } if (l1 == null || l2 == null) { - V2XBizTrace.onAck("$TAG --- marker --- 3 --- line null return ----", "") + V2XBizTrace.onAck("$TAG -marker-3-line null return ----", "") return@post } if (l1.points.isEmpty() || l2.points.isEmpty()) { - V2XBizTrace.onAck("$TAG --- marker --- 3 --- line points null return ----", "") + V2XBizTrace.onAck("$TAG -marker-3-line points null return ----", "") return@post } - V2XBizTrace.onAck("$TAG --- marker --- 4 --- l2:", l2) + V2XBizTrace.onAck("$TAG -marker-4-l2:", l2) val points = LinkedList() if (l2.points.isNotEmpty()) { points.addAll(l2.points.reversed().map { @@ -152,7 +152,7 @@ class AiRoadMarker { } val centerX = marker.poi_lon val centerY = marker.poi_lat - V2XBizTrace.onAck("$TAG --- marker --- 5 --- marker:", marker) + V2XBizTrace.onAck("$TAG -marker-5-marker:", marker) val farthestPoint = marker.polygon?.let { var find: Pair = Pair(centerX, centerY) var min = Long.MAX_VALUE @@ -172,7 +172,7 @@ class AiRoadMarker { MogoLatLng(find.second, find.first) } ?: MogoLatLng(centerY, centerX) marker.farthestPoint = Pair(farthestPoint.lon, farthestPoint.lat) - V2XBizTrace.onAck("$TAG --- marker --- 6 --- marker:", marker) + V2XBizTrace.onAck("$TAG -marker-6-marker:", marker) if (l1.points.isNotEmpty()) { for (l in l1.points) { if (DrivingDirectionUtils.getDegreeOfCar2Poi2( @@ -204,7 +204,7 @@ class AiRoadMarker { builder.points(points) builder.colors(colors) builder.setVisible(true) - V2XBizTrace.onAck("$TAG --- marker --- 7 --- points:", "${points.size}") + V2XBizTrace.onAck("$TAG -marker-7-points:", "${points.size}") val line = overlayManager?.showOrUpdateLine(builder.build()) if (line != null) { this.line.set(line) @@ -220,9 +220,9 @@ class AiRoadMarker { private fun removeLine() { val old = line.get() - V2XBizTrace.onAck("$TAG --- removeRedLine --- 1", "") + V2XBizTrace.onAck("$TAG -removeRedLine-1", "") if (old != null) { - V2XBizTrace.onAck("$TAG --- removeRedLine --- 2", "") + V2XBizTrace.onAck("$TAG -removeRedLine-2", "") line.set(null) old.delegate?.remove() } @@ -230,7 +230,7 @@ class AiRoadMarker { private fun unMarker(marker: Marker) { v2nDrawHandler.post { - V2XBizTrace.onAck("$TAG --- unMarker ---", "") + V2XBizTrace.onAck("$TAG -unMarker-", "") this.marker.set(null) removeLine() roadMarker.removeMarkers() @@ -240,7 +240,7 @@ class AiRoadMarker { } fun receive() { - V2XBizTrace.onAck("$TAG --- receive --- 1 ---", "") + V2XBizTrace.onAck("$TAG -receive-1-", "") val poi = this.marker.get() val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() if (poi != null) { @@ -251,7 +251,7 @@ class AiRoadMarker { poi.poi_lat ) V2XBizTrace.onAck( - "$TAG --- receive --- 2 ---", + "$TAG -receive-2-", "car:[${car.longitude}, ${car.latitude}] -> poi:[${poi.poi_lon}, ${poi.poi_lat}] --> distance:$distance" ) if (distance < 500) { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/warning/V2XFrontWarningScenario.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/warning/V2XFrontWarningScenario.java index df2adcc441..6de3fb5893 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/warning/V2XFrontWarningScenario.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/warning/V2XFrontWarningScenario.java @@ -29,6 +29,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.function.biz.v2x.v2n.utils.V2XEventAnalyticsManager; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Locale; import java.util.concurrent.TimeUnit; @@ -68,7 +69,7 @@ public class V2XFrontWarningScenario extends AbsV2XScenario implements IMoGoChas if (mMarkerEntity != null) { CallerLogger.d(M_V2X + TAG, "----- show --- 2 --:\n" + mMarkerEntity); String v2xType = getV2XTypeForFrontWarning(mMarkerEntity); - V2XMessageEntity entity = getV2XMessageEntity(); +// V2XMessageEntity entity = getV2XMessageEntity(); if (!v2xType.equals("0")) { if (getAlertContentForFrontWarning(mMarkerEntity).toString() == null || getAlertContentForFrontWarning(mMarkerEntity).toString().isEmpty() @@ -112,8 +113,8 @@ public class V2XFrontWarningScenario extends AbsV2XScenario implements IMoGoChas private CharSequence getAlertContentForFrontWarning(V2XWarningTarget entity) { double dis = entity.getDistance(); //距离四舍五入保留整数 - BigDecimal bg = new BigDecimal(dis); - double disBig = bg.setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal bg = BigDecimal.valueOf(dis); + double disBig = bg.setScale(0, RoundingMode.HALF_UP).doubleValue(); String distance = String.format(Locale.getDefault(), "%.0f", disBig) + "米"; String content = entity.getWarningContent(); SpannableStringBuilder ssb = new SpannableStringBuilder(content + distance); diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/VipCarManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/VipCarManager.kt index f8b8b54b48..dce13bd7be 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/VipCarManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/VipCarManager.kt @@ -4,7 +4,6 @@ import android.content.Context import android.os.Handler import android.os.Looper import android.os.Message -import android.util.Log import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.cloud.passport.MoGoAiCloudClientConfig @@ -269,9 +268,6 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe alertContent: CharSequence, ttsContent: String, ) { - if (alertContent.toString().isEmpty() || ttsContent.isEmpty()) { - Log.d("MsgBox-VipCarManager", "alertContent或ttsContent为空!") - } CallerMsgBoxManager.saveMsgBox( MsgBoxBean(MsgBoxType.V2X, V2XMsg(v2xType, alertContent.toString(), ttsContent,CommunicationType.V2N.name)) ) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 5450a5e2c7..a2d5b1ed05 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -21,7 +21,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_SEND import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_MULTI_CONNECT import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_ADAS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_STATUS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_SOCKET_AUTOPILOT import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotControlProvider @@ -347,7 +347,7 @@ class MoGoAutopilotControlProvider : startAutoPilot(controlParameters, Constants.AUTOPILOT_SOURCE.PAD) } - //todo chainlog + //todo emArrow chainlog override fun startAutoPilotByMoFang(controlParameters: AutopilotControlParameters?) { if (controlParameters==null){ startAutoPilotWithNoParameter(Constants.AUTOPILOT_SOURCE.MO_FANG) @@ -649,6 +649,16 @@ class MoGoAutopilotControlProvider : return AdasManager.getInstance().sendFusionMode(cmd) } + /** + * 超车的最大速度闻值(double, m/s, 范围[3, 12.5]) + * + * @param maxSpeed m/s, 范围[3, 12.5] + * @return boolean + */ + override fun sendOvertakeMaxSpeed(maxSpeed: Double): Boolean { + return AdasManager.getInstance().sendOvertakeMaxSpeed(maxSpeed) + } + override fun sendSetParamReq(param: Map): Boolean { return AdasManager.getInstance().sendSetParamReq(param) } @@ -983,7 +993,7 @@ class MoGoAutopilotControlProvider : } @ChainLog( - linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkChainLog = CHAIN_TYPE_STATUS, linkCode = CHAIN_SOURCE_ADAS, nodeAliasCode = CHAIN_CODE_MULTI_CONNECT, paramIndexes = [0] diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index 0263d37654..ab77257189 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -17,13 +17,15 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_AD import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_VEHICLE import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_CONFIG import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_LOC +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_FM_MSG +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_MAP_PARAM import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_PARALLEL import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_P_ACTIONS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_P_OBJECTS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_STATUS_QUERY_RESP import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_ADAS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_GNSS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_STATUS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_SOCKET_AUTOPILOT import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_SOCKET_TRAJECTORY import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_SOCKET_VEHICLE @@ -50,7 +52,6 @@ import com.mogo.eagle.core.function.call.obu.CallerObuMapMathListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningRsiListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningRsmListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningSpatListenerManager -import com.mogo.eagle.core.function.call.v2x.* import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.support.obu.ObuScene @@ -364,7 +365,7 @@ class MoGoAdasListenerImpl : OnAdasListener { //工控机基础配置信息 @ChainLog( - linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkChainLog = CHAIN_TYPE_STATUS, linkCode = CHAIN_SOURCE_ADAS, nodeAliasCode = CHAIN_CODE_ADAS_CAR_CONFIG, paramIndexes = [0, 1] @@ -449,6 +450,13 @@ class MoGoAdasListenerImpl : OnAdasListener { invokeSystemStatus(statusInf) } + //FM消息回调 + @ChainLog( + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_FM_MSG, + paramIndexes = [0, 1] + ) override fun onFaultManagementState(header: MessagePad.Header?, fmInfo: FmInfo.FaultResultMsg) { CallerFaultManagementStateListenerManager.invokeFaultManagementState(fmInfo) } @@ -872,6 +880,12 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param getParamResp 配置参数 * @param adasParam 解析后的配置参数 */ + @ChainLog( + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_MAP_PARAM, + paramIndexes = [0, 1, 2] + ) override fun onGetParamResp( header: MessagePad.Header, getParamResp: MessagePad.SetParamReq, diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt index 1b55e0fd3a..11c5c832ff 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt @@ -9,7 +9,7 @@ import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_STATUS import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setDemoMode @@ -17,7 +17,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.* +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.GsonUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils @@ -35,7 +35,7 @@ import mogo.telematics.pad.MessagePad class TeleMsgHandler : IMsgHandler { - companion object{ + companion object { private const val TAG = "TeleMsgHandler" } @@ -65,7 +65,7 @@ class TeleMsgHandler : IMsgHandler { AdasManager.getInstance().decoderRaw(it.body) } catch (e: Exception) { e.printStackTrace() - invokeNettyConnResult("乘客屏解析数据过程中出现异常:${e.message}") + invokeReqStatusLog(mapOf("dataParseError" to "${e.message}")) } } MogoProtocolMsg.SYNC_MODE_STATUS -> { @@ -93,7 +93,10 @@ class TeleMsgHandler : IMsgHandler { AppConfigInfo.iPCMacAddress = carConfig.macAddress AppConfigInfo.dockerVersion = carConfig.dockVersion listener?.connectDevice(!carConfig.dockVersion.contains("2.3.0")) - CallerDevaToolsManager.getBindingCarInfo(carConfig.macAddress, MoGoAiCloudClientConfig.getInstance().sn) + CallerDevaToolsManager.getBindingCarInfo( + carConfig.macAddress, + MoGoAiCloudClientConfig.getInstance().sn + ) invokeNettyConnResult( "司机屏发送给乘客屏配置信息为:${ TextFormat.printer().escapingNonAscii(false).printToString(carConfig) @@ -130,11 +133,19 @@ class TeleMsgHandler : IMsgHandler { } } TelematicConstant.BUSINESS_STRING -> { - CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.BUSINESS_STRING, it.body) + CallerTelematicListenerManager.invokeReceivedMsg( + TelematicConstant.BUSINESS_STRING, + it.body + ) } TelematicConstant.SHOW_TRAFFIC_LIGHT -> { val trafficLightJson = String(it.body) - CallerTrafficLightListenerManager.invokeTrafficLightStatus(GsonUtils.fromJson(trafficLightJson, TrafficLightResult::class.java)) + CallerTrafficLightListenerManager.invokeTrafficLightStatus( + GsonUtils.fromJson( + trafficLightJson, + TrafficLightResult::class.java + ) + ) } TelematicConstant.HIDE_TRAFFIC_LIGHT -> { ThreadUtils.runOnUiThread { @@ -143,7 +154,10 @@ class TeleMsgHandler : IMsgHandler { } TelematicConstant.CONTROL_PASSENGER_DRIVER_MONITOR -> { ThreadUtils.runOnUiThread { - CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.CONTROL_PASSENGER_DRIVER_MONITOR,it.body) + CallerTelematicListenerManager.invokeReceivedMsg( + TelematicConstant.CONTROL_PASSENGER_DRIVER_MONITOR, + it.body + ) } } @@ -188,8 +202,8 @@ class TeleMsgHandler : IMsgHandler { MogoProtocolMsg.REQ_MAC_ADDRESS, configArray.size, configArray ), channel - ) { - invokeNettyConnResult("司机屏发送配置信息到乘客屏是否成功:${it.isSuccess}") + ) { future -> + invokeReqStatusLog(mapOf("dSendParam2P" to future.isSuccess)) } } else { queryCarConfig() @@ -205,15 +219,18 @@ class TeleMsgHandler : IMsgHandler { val snArray = sn.toByteArray() NSDNettyManager.getInstance().sendMsgToSpecifiedClient( MogoProtocolMsg(10, snArray.size, snArray), channel - ) { - invokeNettyConnResult("司机屏发送SN(${sn})到乘客屏是否成功:${it.isSuccess}") + ) { future -> + invokeReqStatusLog(mapOf("dSendSN2P" to future.isSuccess, "sn" to sn)) } } else { invokeNettyConnResult("司机屏SN未获取到,不发送给乘客屏") } } TelematicConstant.BUSINESS_STRING -> { - CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.BUSINESS_STRING, it.body) + CallerTelematicListenerManager.invokeReceivedMsg( + TelematicConstant.BUSINESS_STRING, + it.body + ) } else -> { } @@ -245,12 +262,12 @@ class TeleMsgHandler : IMsgHandler { } // AdasManager.getInstance().startDispatchHandler() ToastUtils.showShort("连接司机屏成功!") - invokeNettyConnResult("乘客屏连接司机屏成功") + invokeReqStatusLog(mapOf("dpConnectStatus" to true)) val byteArray = byteArrayOf(0) NSDNettyManager.getInstance().sendMogoProtocolMsgToServer( MogoProtocolMsg(MogoProtocolMsg.REQ_MAC_ADDRESS, byteArray.size, byteArray) ) { - invokeNettyConnResult("乘客屏请求配置信息的数据发送是否成功:${it}") + invokeReqStatusLog(mapOf("pReqParamSendResult" to it)) } // 请求司机屏SN reqServerSN() @@ -261,14 +278,14 @@ class TeleMsgHandler : IMsgHandler { AppConfigInfo.plateNumber = "" AppConfigInfo.iPCMacAddress = "" ToastUtils.showLong("断开和司机屏的连接!") - invokeNettyConnResult("断开和司机屏的连接!") + invokeReqStatusLog(mapOf("dpConnectStatus" to false)) AdasManager.getInstance().stopDispatchHandler() } } ConnectState.STATUS_CONNECT_ERROR -> { AppConfigInfo.plateNumber = "" ToastUtils.showLong("和司机端连接异常!") - invokeNettyConnResult("乘客屏和司机屏连接异常,错误为:$content") + invokeReqStatusLog(mapOf("dpConnectErrorMsg" to "$content")) AdasManager.getInstance().stopDispatchHandler() } else -> { @@ -280,7 +297,7 @@ class TeleMsgHandler : IMsgHandler { override fun handleServerConnStatus(statusCode: Int, content: String?, channel: Channel) {} @ChainLog( - linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkChainLog = CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_ADAS, nodeAliasCode = ChainConstant.CHAIN_CODE_MULTI_CONNECT, paramIndexes = [0] @@ -289,6 +306,16 @@ class TeleMsgHandler : IMsgHandler { CallerLogger.d("${SceneConstant.M_D_C}$TAG", status) } + @ChainLog( + linkChainLog = CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_MULTI_CONNECT, + paramIndexes = [0] + ) + private fun invokeReqStatusLog(param: Map) { + CallerLogger.d("${SceneConstant.M_D_C}$TAG", param.toString()) + } + /** * 记录最新的司机屏发送数据的时间戳 * 或乘客屏解析数据的时间戳 @@ -317,7 +344,7 @@ class TeleMsgHandler : IMsgHandler { NSDNettyManager.getInstance().sendMogoProtocolMsgToServer( MogoProtocolMsg(10, byteArray.size, byteArray) ) { - invokeNettyConnResult("乘客屏请求司机屏SN的数据发送是否成功:${it}") + invokeReqStatusLog(mapOf("pReqSNSendResult" to it)) } delay(700) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/SpeedLimitDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/SpeedLimitDispatcher.kt index 0346113ae1..639072fbfa 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/SpeedLimitDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/SpeedLimitDispatcher.kt @@ -31,7 +31,7 @@ class SpeedLimitDispatcher : ILimitingVelocityListener { /** * 地图限速数据 */ -// @BizConfig(FuncBizConfig.V2I, "", FuncBizConfig.BIZ_SLW) //todo arrow 重新考虑放的位置 +// @BizConfig(FuncBizConfig.V2I, "", FuncBizConfig.BIZ_SLW) //todo emArrow 重新考虑放的位置 override fun onUnion(limitingVelocity: Int, sourceType: DataSourceType) { super.onUnion(limitingVelocity, sourceType) when (sourceType) { // obu 优先级高于 map,体现链路能力 diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt index 08609c5556..b185e1543e 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt @@ -66,6 +66,13 @@ object DataManager { mutableListOf() } + /** + * FSM消息(缓存数据库时使用) + */ + private val fmInfoList by lazy { + mutableListOf() + } + private val scope by lazy { Utils.getApp().lifeCycleScope } @@ -122,6 +129,12 @@ object DataManager { } CallerMsgBoxListenerManager.invokeListener(MsgCategory.NOTICE, msg) } + MsgBoxType.FMINFO -> { + CallerMsgBoxListenerManager.invokeListener(MsgCategory.FM_INFO, msg) + } + MsgBoxType.VOICE -> { + CallerMsgBoxListenerManager.invokeListener(MsgCategory.VOICE_INFO, msg) + } MsgBoxType.OBU, MsgBoxType.NOTICE, MsgBoxType.OPERATION -> { synchronized(this) { notifyList.add(msg) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxConfig.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxConfig.kt index e92e474d28..241ad69f8c 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxConfig.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxConfig.kt @@ -37,6 +37,9 @@ class MsgBoxConfig { //录包信息缓存列表 @JvmField var recordBagList: ArrayList = ArrayList() + //播放小智语音消息时的未播放消息缓存列表 + @JvmField + var unPlayList: ArrayList = ArrayList() } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-devatools/src/main/AndroidManifest.xml index b0de6b5f86..56b7521c8a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/AndroidManifest.xml @@ -8,4 +8,5 @@ + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 8c4130608a..0b4499c1e7 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -109,7 +109,7 @@ class DevaToolsProvider : IDevaToolsProvider { iPCReportManager.initServer() BindingCarManager.init(mContext!!) apmEnvProvider.init(if(DebugConfig.isDebug()) "0" else "1", "${ DebugConfig.getNetMode() }", mDockerVersion ?: "") - BadCaseManager.init() + BadCaseManager.init(mContext!!) if (DebugConfig.isDebug()) { SdtManager.init(mContext!!, true, DetectResultImpl()) // 监听弱网 @@ -173,7 +173,7 @@ class DevaToolsProvider : IDevaToolsProvider { if (plugin is TracePlugin) { if (tag == SharePluginInfo.TAG_PLUGIN_EVIL_METHOD) { isEvil = true - printEvilMsg(issue.toString()) + printEvilMsg(mapOf("evilMethod" to issue.toString())) } } } @@ -216,7 +216,7 @@ class DevaToolsProvider : IDevaToolsProvider { nodeAliasCode = ChainConstant.CHAIN_CODE_RECORD_ANR, paramIndexes = [0] ) - private fun printEvilMsg(evilMethod: String) { + private fun printEvilMsg(evilMethod: Map) { w("TraceCanary", evilMethod) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt index 65a2c104ac..d9e3bc01e4 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt @@ -6,7 +6,7 @@ import android.widget.Toast import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_INIT_ENV_RESTART import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_INIT -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_STATUS import com.mogo.eagle.core.function.api.devatools.apm.* import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.apm.config.* @@ -84,7 +84,7 @@ class ApmEnvProviderImpl: IApmEnvProvider, CoroutineScope { val appRelaunched = ApmEnvConfig.isAppRelaunched() if ((!isEnvValid || (buildTypeChanged || netTypeChanged || dockerVersionChanged)) && !appRelaunched) { ApmEnvConfig.setAppRelaunched(true) - restartApp("buildType:$buildType,netType:$netType,dockerVersion:$dockerVersion") + restartApp(mapOf("buildType" to buildType, "netType" to netType,"dockerVersion" to dockerVersion)) return@launch } if (isFirstDockerVersionSet) { @@ -110,12 +110,12 @@ class ApmEnvProviderImpl: IApmEnvProvider, CoroutineScope { } @ChainLog( - linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkChainLog = CHAIN_TYPE_STATUS, linkCode = CHAIN_SOURCE_INIT, nodeAliasCode = CHAIN_CODE_INIT_ENV_RESTART, paramIndexes = [0] ) - private fun restartApp(envStr:String) { + private fun restartApp(envStr:Map) { launch(Dispatchers.Main) { Toast.makeText(Utils.getApp(), "发现系统环境不一致,正在重启...", Toast.LENGTH_SHORT).show() delay(50) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 22bc2a120b..7077e66053 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -24,11 +24,11 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.* +import com.mogo.tts.base.SpeechUtils import com.zhjt.mogo_core_function_devatools.badcase.biz.* import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord import com.zhjt.mogo_core_function_devatools.ext.enqueuePop -import kotlinx.coroutines.* import me.jessyan.autosize.utils.AutoSizeUtils import record_cache.RecordPanelOuterClass @@ -41,8 +41,9 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis @Volatile private var record: AutoPilotRecord? = null - fun init() { + fun init(context: Context) { CallerAutopilotRecordListenerManager.addListener(TAG, this) + SpeechUtils.init(context) } /** diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java index ea8ae41b25..b924f6213a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java @@ -48,10 +48,10 @@ public class CaseTopicListDialog extends Dialog implements IMoGoAutopilotRecordL private RecyclerView rvTopicList; private TopicListAdapter topicListAdapter; private String searchStr; - private List allTopicList = new ArrayList<>(); + private final List allTopicList = new ArrayList<>(); private RecordTypeEntity recordType; - private List addTopicList = new ArrayList<>(); - private List searchTopicList = new ArrayList<>(); + private final List addTopicList = new ArrayList<>(); + private final List searchTopicList = new ArrayList<>(); public CaseTopicListDialog(@NonNull Context context) { super(context, R.style.bad_case_dialog); diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt index 7707869bda..9b258332b8 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt @@ -3,14 +3,22 @@ package com.zhjt.mogo_core_function_devatools.badcase.biz import android.annotation.SuppressLint import android.app.Activity import android.graphics.PixelFormat +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.os.SystemClock import android.util.DisplayMetrics +import android.util.Log import android.view.* import android.widget.CheckBox import android.widget.ImageView import android.widget.TextView +import com.iflytek.cloud.ErrorCode +import com.iflytek.cloud.InitListener +import com.iflytek.cloud.RecognizerListener +import com.iflytek.cloud.RecognizerResult +import com.iflytek.cloud.SpeechError +import com.iflytek.cloud.SpeechRecognizer import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.deva.badcase.BagDescriptionEntity @@ -26,9 +34,12 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.BarUtils +import com.mogo.eagle.core.utilcode.util.JsonParser import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.tts.base.SpeechUtils import com.zhidao.loglib.call.LogInfoManagerFactory import com.zhidao.loglib.upload.OnUploadListener import com.zhidao.loglib.upload.UploadManager @@ -39,9 +50,10 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.record.RecordManager import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import org.json.JSONException +import org.json.JSONObject import record_cache.RecordPanelOuterClass import java.io.File -import java.lang.StringBuilder import java.util.* @@ -84,6 +96,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private var audioFileName:String?=null //录音文件名称 private var uploadReason: StringBuilder = StringBuilder() //上报原因,标签 + private var reasonDetail: String ?= null //语音转写 @Volatile private var recordKey: Long = 0 //录制bag包key @Volatile @@ -102,6 +115,14 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private var clickListener: ClickListener? = null + // 语音听写对象 + private var mIat: SpeechRecognizer? = null + + var ret = 0 // 函数调用返回值 + + // 用HashMap存储听写结果 + private val mIatResults: HashMap = LinkedHashMap() + init { initFloatWindow() } @@ -115,6 +136,10 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_initiative_bad_case, null) as View mFloatLayout.setOnTouchListener(this) + // 初始化识别无UI识别对象 + // 使用SpeechRecognizer对象,可根据回调消息自定义界面; + mIat = SpeechRecognizer.createRecognizer(mActivity, mInitListener) + tvInitiativeNum = mFloatLayout.findViewById(R.id.tvInitiativeNum) tvInitiativeTime = mFloatLayout.findViewById(R.id.tvInitiativeTime) tvInitiativeIdentity = mFloatLayout.findViewById(R.id.tvInitiativeIdentity) @@ -172,10 +197,10 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList uploadReason.append("点刹、顿挫") } if(audioStatus){ - audioStatus = !audioStatus - setAudio(audioStatus) + audioStatus = false + setAudio(false) Handler().postDelayed({ - uploadAudio() + uploadAudio() },1000) }else{ uploadAudio() @@ -200,11 +225,91 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } } + /** + * 初始化监听器。 + */ + private val mInitListener = InitListener { code -> + Log.i(TAG, "SpeechRecognizer init() code = $code") + if (code != ErrorCode.SUCCESS) { + ToastUtils.showShort("讯飞语音听写初始化失败,错误码:$code") + } + } + + /** + * 听写监听器。 + */ + private val mRecognizerListener: RecognizerListener = object : RecognizerListener{ + override fun onVolumeChanged(p0: Int, p1: ByteArray?) { + //showTip("当前正在说话,音量大小 = " + volume + " 返回音频数据 = " + data.length); + } + + override fun onBeginOfSpeech() { + // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 + } + + override fun onEndOfSpeech() { + // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 + } + + override fun onResult(results: RecognizerResult?, isLast: Boolean) { + results?.let { + printResult(it) + } + } + + override fun onError(p0: SpeechError?) { + // Tips: + // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 + } + + override fun onEvent(p0: Int, p1: Int, p2: Int, p3: Bundle?) { + // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 + // 若使用本地能力,会话id为null + // if (SpeechEvent.EVENT_SESSION_ID == eventType) { + // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); + // Log.d(TAG, "session id =" + sid); + // } + } + + } + + /** + * 显示结果 + */ + private fun printResult(results: RecognizerResult) { + val text: String = JsonParser.parseIatResult(results.resultString) + var sn: String? = null + // 读取json结果中的sn字段 + try { + val resultJson = JSONObject(results.resultString) + sn = resultJson.optString("sn") + } catch (e: JSONException) { + e.printStackTrace() + } + mIatResults[sn!!] = text + val resultBuffer = java.lang.StringBuilder() + for (key in mIatResults.keys) { + resultBuffer.append(mIatResults[key]) + } + Log.i(TAG, "语音内容=$resultBuffer") + reasonDetail = resultBuffer.toString() + } + var countDownTimer: CountDownTimer?=null private fun setAudio(status: Boolean){ if(status){ //开始录音 + mIat?.let { + //清空之前的内容 + mIatResults.clear() + SpeechUtils.setParam(it) + // 不显示听写对话框 + ret = it.startListening(mRecognizerListener) + if (ret != ErrorCode.SUCCESS) { + ToastUtils.showShort("听写失败,错误码:$ret,请点击网址https://www.xfyun.cn/document/error-code查询解决方案") + } + } audioFileName = "Audio_${System.currentTimeMillis()}_BadCase" RecordManager.getInstance().start(audioFileName) //更改录音按钮背景 @@ -229,6 +334,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList countDownTimer?.start() } }else{ + //停止语音听写 + mIat?.stopListening() //结束倒计时 countDownTimer?.cancel() countDownTimer?.onFinish() @@ -292,7 +399,11 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList itx["filename"] = recordFileName?:"" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 itx["key"] = recordKey.toString() //key - itx["reason"] = uploadReason.toString() //采集原因 + if(reasonDetail.isNullOrEmpty()){ + itx["reason"] = uploadReason.toString() + }else{ + itx["reason"] = "$uploadReason 语音内容:$reasonDetail" //采集原因 + } itx["duration"] = BadCaseConfig.totalDuration.toString() //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) itx["channel"] = "1" //渠道 @@ -336,7 +447,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList if(receiveTime!=null){ try { uploadStamp=TimeUtils.dateToStamp(receiveTime,"yyyyMMddHHmmss") - }catch (e: Exception){ + }catch (_: Exception){ } } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index 352f678b83..043cb6d93f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt @@ -4,15 +4,23 @@ import android.annotation.SuppressLint import android.app.Activity import android.graphics.Color import android.graphics.PixelFormat +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.util.DisplayMetrics +import android.util.Log import android.view.* import android.widget.CheckBox import android.widget.CompoundButton import android.widget.ImageView import android.widget.TextView import com.google.android.flexbox.FlexboxLayout +import com.iflytek.cloud.ErrorCode +import com.iflytek.cloud.InitListener +import com.iflytek.cloud.RecognizerListener +import com.iflytek.cloud.RecognizerResult +import com.iflytek.cloud.SpeechError +import com.iflytek.cloud.SpeechRecognizer import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.deva.badcase.BagDescriptionEntity @@ -27,6 +35,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.mogo.tts.base.SpeechUtils import com.zhidao.loglib.call.LogInfoManagerFactory import com.zhidao.loglib.upload.OnUploadListener import com.zhjt.mogo_core_function_devatools.R @@ -39,6 +48,8 @@ import com.zhidao.loglib.util.FileUtil import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager import me.jessyan.autosize.utils.AutoSizeUtils import org.greenrobot.eventbus.EventBus +import org.json.JSONException +import org.json.JSONObject import java.io.File /** @@ -92,6 +103,16 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private lateinit var flReasonLayout: FlexboxLayout + // 语音听写对象 + private var mIat: SpeechRecognizer? = null + + var ret = 0 // 函数调用返回值 + + // 用HashMap存储听写结果 + private val mIatResults: HashMap = LinkedHashMap() + + private var reasonDetail: String ?= null //语音转写 + init { initFloatWindow() } @@ -104,6 +125,11 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private fun initFloatWindow(){ mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_passive_bad_case, null) as View mFloatLayout.setOnTouchListener(this) + + // 初始化识别无UI识别对象 + // 使用SpeechRecognizer对象,可根据回调消息自定义界面; + mIat = SpeechRecognizer.createRecognizer(mActivity, mInitListener) + tvPassiveNum = mFloatLayout.findViewById(R.id.tvPassiveNum) tvPassiveTime = mFloatLayout.findViewById(R.id.tvPassiveTime) tvPassiveIdentity = mFloatLayout.findViewById(R.id.tvPassiveIdentity) @@ -163,9 +189,90 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } } + /** + * 初始化监听器。 + */ + private val mInitListener = InitListener { code -> + Log.i(TAG, "SpeechRecognizer init() code = $code") + if (code != ErrorCode.SUCCESS) { + ToastUtils.showShort("讯飞语音听写初始化失败,错误码:$code") + } + } + + /** + * 听写监听器。 + */ + private val mRecognizerListener: RecognizerListener = object : RecognizerListener{ + override fun onVolumeChanged(p0: Int, p1: ByteArray?) { + //showTip("当前正在说话,音量大小 = " + volume + " 返回音频数据 = " + data.length); + } + + override fun onBeginOfSpeech() { + // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 + } + + override fun onEndOfSpeech() { + // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 + } + + override fun onResult(results: RecognizerResult?, isLast: Boolean) { + results?.let { + printResult(it) + } + } + + override fun onError(p0: SpeechError?) { + // Tips: + // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 + } + + override fun onEvent(p0: Int, p1: Int, p2: Int, p3: Bundle?) { + // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 + // 若使用本地能力,会话id为null + // if (SpeechEvent.EVENT_SESSION_ID == eventType) { + // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); + // Log.d(TAG, "session id =" + sid); + // } + } + + } + + /** + * 显示结果 + */ + private fun printResult(results: RecognizerResult) { + val text: String = JsonParser.parseIatResult(results.resultString) + var sn: String? = null + // 读取json结果中的sn字段 + try { + val resultJson = JSONObject(results.resultString) + sn = resultJson.optString("sn") + } catch (e: JSONException) { + e.printStackTrace() + } + mIatResults[sn!!] = text + val resultBuffer = java.lang.StringBuilder() + for (key in mIatResults.keys) { + resultBuffer.append(mIatResults[key]) + } + Log.i(TAG, "语音内容=$resultBuffer") + reasonDetail = resultBuffer.toString() + } + + private fun setAudio(status: Boolean){ if(status){ //开始录音 + mIat?.let { + //清空之前的内容 + mIatResults.clear() + SpeechUtils.setParam(it) + // 不显示听写对话框 + ret = it.startListening(mRecognizerListener) + if (ret != ErrorCode.SUCCESS) { + ToastUtils.showShort("听写失败,错误码:$ret,请点击网址https://www.xfyun.cn/document/error-code查询解决方案") + } + } audioFileName = "Audio_${System.currentTimeMillis()}_BadCase" RecordManager.getInstance().start(audioFileName) //更改录音按钮背景 @@ -190,6 +297,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene countDownTimer?.start() } }else{ + //停止语音听写 + mIat?.stopListening() //结束倒计时 countDownTimer?.cancel() countDownTimer?.onFinish() @@ -253,7 +362,11 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene itx["filename"] = recordFileName?:"" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 itx["key"] = recordKey?:"" //key - itx["reason"] = uploadReason //采集原因 + if(reasonDetail.isNullOrEmpty()){ + itx["reason"] = uploadReason + }else{ + itx["reason"] = "$uploadReason 语音内容:$reasonDetail" //采集原因 + } itx["duration"] = BadCaseConfig.totalDuration.toString() //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) itx["channel"] = "0" //渠道 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/CaseListAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/CaseListAdapter.kt index 8e211749b0..ed86507820 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/CaseListAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/CaseListAdapter.kt @@ -13,7 +13,7 @@ import com.zhjt.mogo_core_function_devatools.R * @description Case清单列表适配器 * @since: 2022/10/19 */ -class CaseListAdapter: RecyclerView.Adapter() { +open class CaseListAdapter: RecyclerView.Adapter() { private var data:List? = null private var caseClickListener: CaseClickListener?=null diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/TopicListAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/TopicListAdapter.kt index 33bb3ff608..e107e18b89 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/TopicListAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/TopicListAdapter.kt @@ -13,7 +13,7 @@ import com.zhjt.mogo_core_function_devatools.R * @description Topic列表适配器 * @since: 2022/10/19 */ -class TopicListAdapter: RecyclerView.Adapter() { +open class TopicListAdapter: RecyclerView.Adapter() { private var data:MutableList? = null private var topicClickListener: TopicClickListener? = null diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java index f4ec60ac13..9de418509a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java @@ -6,14 +6,12 @@ import android.text.TextUtils; //播放试听 public class Audition implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener{ - private static volatile Audition INSTANCE; public MediaPlayer mediaPlayer; private String oldPath; private OnAuditionListener listener; public interface OnAuditionListener { void onAuditionCompletion(); - } public void registerOnAuditionListener(OnAuditionListener listener) { @@ -28,16 +26,12 @@ public class Audition implements MediaPlayer.OnPreparedListener, MediaPlayer.OnC } public static Audition getInstance() { - if (INSTANCE == null) { - synchronized (Audition.class) { - if (INSTANCE == null) { - INSTANCE = new Audition(); - } - } - } - return INSTANCE; + return Holder.INSTANCE; } + private static final class Holder{ + private static final Audition INSTANCE = new Audition(); + } public boolean isPlaying() { return mediaPlayer != null && mediaPlayer.isPlaying(); diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java index d7a33d08ae..e7f3875873 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java @@ -5,7 +5,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_DEV import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Environment; -import android.util.Log; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.FileUtils; @@ -42,7 +41,7 @@ public class RecordHelper { private File resultFile = null; private File tmpFile = null; - private List files = new ArrayList<>(); + private final List files = new ArrayList<>(); private Mp3EncodeThread mp3EncodeThread; public RecordHelper(RecordConfig config) { @@ -69,7 +68,9 @@ public class RecordHelper { return; } String path = getFilePath(fileName); - resultFile = new File(path); + if(path!=null){ + resultFile = new File(path); + } String tempFilePath = getTempFilePath(); tmpFile = new File(tempFilePath); audioRecordThread = new AudioRecordThread(); @@ -134,7 +135,7 @@ public class RecordHelper { } } - private FftFactory fftFactory = new FftFactory(FftFactory.Level.Original); + private final FftFactory fftFactory = new FftFactory(FftFactory.Level.Original); private void notifyData(final byte[] data) { if (listener != null) { @@ -192,14 +193,10 @@ public class RecordHelper { @Override public void run() { super.run(); - - switch (currentConfig.getFormat()) { - case MP3: - startMp3Recorder(); - break; - default: - startPcmRecorder(); - break; + if (currentConfig.getFormat() == RecordConfig.RecordFormat.MP3) { + startMp3Recorder(); + } else { + startPcmRecorder(); } } @@ -275,12 +272,9 @@ public class RecordHelper { private void stopMp3Encoded() { if (mp3EncodeThread != null) { - mp3EncodeThread.stopSafe(new Mp3EncodeThread.EncordFinishListener() { - @Override - public void onFinish() { - notifyFinish(); - mp3EncodeThread = null; - } + mp3EncodeThread.stopSafe(() -> { + notifyFinish(); + mp3EncodeThread = null; }); } else { CallerLogger.e("$M_DEVA$TAG", "mp3EncodeThread is null, 代码业务流程有误,请检查!! "); @@ -382,8 +376,7 @@ public class RecordHelper { } String format = currentConfig.getFormat().getExtension(); - String filePath = String.format(Locale.getDefault(), "%s%s%s", ROOT_PATH, fileName, format); - return filePath; + return String.format(Locale.getDefault(), "%s%s%s", ROOT_PATH, fileName, format); } private String getTempFilePath() { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordManager.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordManager.java index a8a167bb27..b4ec2edc7a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordManager.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordManager.java @@ -7,9 +7,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.record.listener.RecordListe public class RecordManager { - private static final String TAG = RecordManager.class.getSimpleName(); @SuppressLint("StaticFieldLeak") - private volatile static RecordManager instance; private final RecordHelper recordHelper; /** * 录音配置 @@ -21,14 +19,11 @@ public class RecordManager { } public static RecordManager getInstance() { - if (instance == null) { - synchronized (RecordManager.class) { - if (instance == null) { - instance = new RecordManager(); - } - } - } - return instance; + return Holder.instance; + } + + private static final class Holder{ + private static final RecordManager instance = new RecordManager(); } // /** diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt index 9b93806824..6d75602abd 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt @@ -3,7 +3,6 @@ package com.zhjt.mogo_core_function_devatools.binding import android.annotation.* import android.content.Context import android.text.TextUtils -import com.elegant.utils.UiThreadHandler import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.constants.SharedPrefsConstants import com.mogo.eagle.core.data.app.AppConfigInfo.role @@ -25,7 +24,6 @@ import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeAppNetWorkManager import mogo.telematics.pad.MessagePad /** - * //todo emArrow 链路biz * 车辆绑定 */ @SuppressLint("StaticFieldLeak") diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt index 3a0b9d64d3..778cc13a1e 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt @@ -8,6 +8,7 @@ import com.mogo.eagle.core.data.deva.bindingcar.BindingCarInfo import com.mogo.eagle.core.data.deva.bindingcar.BindingCarRequest import com.mogo.eagle.core.data.deva.bindingcar.ModifyBindingcarInfo import com.mogo.eagle.core.data.config.HdMapBuildConfig +import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showBindingCarDialog import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showModifyBindingCarDialog import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager @@ -20,6 +21,7 @@ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.GsonUtils import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.service.chain.ChainLog import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -65,6 +67,7 @@ class BindingCarNetWorkManager private constructor() { MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request) ) + bindLog(mapOf("bingReq" to request)) mBindingCarApiService.getBindingCarInfo(requestBody) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -72,7 +75,7 @@ class BindingCarNetWorkManager private constructor() { override fun onSubscribe(d: Disposable) {} override fun onNext(info: BindingCarInfo) { if (info != null && info.getData() != null) { - d(SceneConstant.M_DEVA + TAG, "getBindingCarInfo data =" + info.getData().toString() + "---getDefaultId() : ${getDefaultId()}") + bindLog(mapOf("bindResult" to true,"carType" to getDefaultId(),"msg" to info)) SharedPrefsMgr.getInstance(context).putString( SharedPrefsConstants.CAR_INFO, GsonUtils.toJson(info.getData()) @@ -91,6 +94,7 @@ class BindingCarNetWorkManager private constructor() { override fun onError(e: Throwable) { SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.CAR_INFO, "") + bindLog(mapOf("bindResult" to false,"msg" to e.toString())) e(SceneConstant.M_DEVA + TAG, "getBindingCarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message + "---getDefaultId() : ${getDefaultId()}") } @@ -115,6 +119,7 @@ class BindingCarNetWorkManager private constructor() { widevineIDWithMd5, screenType ) + bindLog(mapOf("bindingReq" to request)) val requestBody = RequestBody.create( MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request) @@ -127,13 +132,13 @@ class BindingCarNetWorkManager private constructor() { override fun onNext(info: ModifyBindingcarInfo) { if (info != null) { callBack.invoke(info) - d(SceneConstant.M_DEVA + TAG, "modifyBindingCar onNext code = " + info.code + "---msg = " + info.msg + "--info.toString() = " + info.toString()) + bindLog(mapOf("bindingStatus" to true,"bindMsg" to info)) updateCarVrIconRes(info.data.brandId) } } override fun onError(e: Throwable) { - e(SceneConstant.M_DEVA + TAG, "modifyBindingCar onError e = " + e.toString() + "---e.getMessage = " + e.message) + bindLog(mapOf("bindingStatus" to false,"bindMsg" to e.toString())) } override fun onComplete() {} @@ -177,6 +182,16 @@ class BindingCarNetWorkManager private constructor() { } } + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_INIT, + nodeAliasCode = ChainConstant.CHAIN_CODE_BINDING_CAR, + paramIndexes = [0] + ) + private fun bindLog(msg:Map){ + d(SceneConstant.M_DEVA + TAG, "bindLog : $msg") + } + private fun getDefaultId(): String { return when (HdMapBuildConfig.currentCarVrIconRes) { R.raw.chuzuche -> "1" diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/block/MainBlockLinkedLog.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/block/MainBlockLinkedLog.kt index 6cbb66cf99..eea4d563f0 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/block/MainBlockLinkedLog.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/block/MainBlockLinkedLog.kt @@ -14,7 +14,7 @@ internal class MainBlockLinkedLog { } @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_HMI, + linkChainLog = ChainConstant.CHAIN_TYPE_ANR_LEAK, linkCode = ChainConstant.CHAIN_SOURCE_HMI, nodeAliasCode = ChainConstant.CHAIN_CODE_MAIN_BLOCK, paramIndexes = [0] diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt index efdd65d59b..1ab4a727c3 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -6,7 +6,7 @@ import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_FUNC_CONFIG_CHANGED import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_CLOUD -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_STATUS import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager @@ -71,7 +71,7 @@ class FuncConfigCenter : IMogoOnMessageListener, IMoGoAutopilotCarCo } @ChainLog( - linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkChainLog = CHAIN_TYPE_STATUS, linkCode = CHAIN_SOURCE_CLOUD, nodeAliasCode = CHAIN_CODE_FUNC_CONFIG_CHANGED, paramIndexes = [0] diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/matrix/DynamicConfigImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/matrix/DynamicConfigImpl.kt index aa4cf8ea67..815211ef05 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/matrix/DynamicConfigImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/matrix/DynamicConfigImpl.kt @@ -21,23 +21,23 @@ class DynamicConfigImpl: IDynamicConfig { } override fun get(key: String?, defStr: String?): String { - return "" + return defStr ?: "" } override fun get(key: String?, defInt: Int): Int { - return 0 + return defInt } override fun get(key: String?, defLong: Long): Long { - return 0L + return defLong } override fun get(key: String?, defBool: Boolean): Boolean { - return false + return true } override fun get(key: String?, defFloat: Float): Float { - return 0f + return defFloat } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt index 1214c246a3..9a99c41274 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt @@ -11,31 +11,63 @@ internal class MoFangAnalyticUtils { // 魔方连接状态 const val EVENT_MOFANG_CONNECT = "event_mofang_connect" - const val EVENT_SUB_START_CONNECT = "event_sub_start_connect" - const val EVENT_SUB_CONNECT_SUCCESS = "event_sub_connect_success" - const val EVENT_SUB_START_DISCONNECT = "event_sub_start_disconnect" - const val EVENT_SUB_DISCONNECT_SUCCESS = "event_sub_disconnect_success" - const val EVENT_SUB_DISCONNECT_SLEEP = "event_sub_disconnect_sleep" - const val EVENT_SUB_BLUETOOTH_SETTING_REQ = "event_sub_ble_set_req" - const val EVENT_SUB_BLUETOOTH_OPEN_DENY = "event_sub_ble_open_deny" - const val EVENT_SUB_BLUETOOTH_OPEN_AGREE = "event_sub_ble_open_agree" - const val EVENT_SUB_IS_VALID = "event_sub_is_ipt_valid" - const val EVENT_SUB_IS_INVALID = "event_sub_is_ipt_invalid" + const val EVENT_MOFANG_CONNECT_PARAMS_START_CONNECT = "event_sub_start_connect" + const val EVENT_MOFANG_CONNECT_PARAMS_CONNECT_SUCCESS = "event_sub_connect_success" + const val EVENT_MOFANG_CONNECT_PARAMS_START_DISCONNECT = "event_sub_start_disconnect" + const val EVENT_MOFANG_CONNECT_PARAMS_DISCONNECT_SUCCESS = "event_sub_disconnect_success" + const val EVENT_MOFANG_CONNECT_PARAMS_DISCONNECT_SLEEP = "event_sub_disconnect_sleep" + const val EVENT_MOFANG_CONNECT_PARAMS_SETTING_REQ = "event_sub_ble_set_req" + const val EVENT_MOFANG_CONNECT_PARAMS_OPEN_DENY = "event_sub_ble_open_deny" + const val EVENT_MOFANG_CONNECT_PARAMS_OPEN_AGREE = "event_sub_ble_open_agree" + const val EVENT_MOFANG_CONNECT_PARAMS_IS_VALID = "event_sub_is_ipt_valid" + const val EVENT_MOFANG_CONNECT_PARAMS_IS_INVALID = "event_sub_is_ipt_invalid" // 魔方电量 const val EVENT_BATTERY = "event_mofang_battery" - const val EVENT_BATTERY_VALUE = "battery" + const val EVENT_BATTERY_PARAMS_VALUE = "battery" + const val EVENT_BATTERY_PARAMS_DUR = "dur" // 收到魔方按键指令 const val EVENT_INPUT = "event_mofang_input" - const val EVENT_INPUT_SUB_KEYCODE = "keycode" - const val EVENT_INPUT_SUB_TYPE = "input_type" // 1:单击,2:长按, 3:组合键 + const val EVENT_INPUT_PARAMS_KEYCODE = "keycode" + const val EVENT_INPUT_PARAMS_TYPE = "input_type" // 1:单击,2:长按, 3:组合键 // 执行魔方按键指令 const val EVENT_EXECUTE = "event_mofang_execute" - const val EVENT_EXECUTE_SUB_KEYCODE = "keycode" - const val EVENT_EXECUTE_SUB_TYPE = "input_type" // 1:单击,2:长按, 3:组合键 + const val EVENT_EXECUTE_PARAMS_KEYCODE = "keycode" + const val EVENT_EXECUTE_PARAMS_TYPE = "input_type" // 1:单击,2:长按, 3:组合键 + const val EVENT_EXECUTE_PARAMS_LON = "lon" // 执行时自车经度 + const val EVENT_EXECUTE_PARAMS_LAT = "lat" // 执行时自车纬度 + const val EVENT_EXECUTE_PARAMS_SPEED = "speed" // 执行时自车速度 + const val EVENT_EXECUTE_PARAMS_ACC = "acc" // 执行时自车加速度 + const val EVENT_EXECUTE_PARAMS_HEADING = "head" // 执行时自车航向角 + const val EVENT_EXECUTE_PARAMS_LINE_ID = "line_id" // 执行时的路线id + + + // 魔方按键指令回执-工控机收到 + const val EVENT_EXECUTE_FEEDBACK_RECEIVE = "event_mofang_fb_receive" + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_NODE = "node" + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_CODE = "code" + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_MSG = "msg" + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LON = "lon" // 时自车经度 + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LAT = "lat" // 执行时自车纬度 + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_SPEED = "speed" // 执行时自车速度 + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_ACC = "acc" // 执行时自车加速度 + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_HEADING = "head" // 执行时自车航向角 + const val EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LINE_ID = "line_id" // 执行时的路线id + + // 魔方按键指令回执-工控机执行 + const val EVENT_EXECUTE_FEEDBACK_EXECUTE = "event_mofang_fb_execute" + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_NODE = "node" + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_CODE = "code" + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_MSG = "msg" + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LON = "lon" // 执行时自车经度 + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LAT = "lat" // 执行时自车纬度 + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_SPEED = "speed" // 执行时自车速度 + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_ACC = "acc" // 执行时自车加速度 + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_HEADING = "head" // 执行时自车航向角 + const val EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LINE_ID = "line_id" // 执行时的路线id private val handler by lazy { HandlerThread("mofang-analytic-worker", Process.THREAD_PRIORITY_BACKGROUND).let { it.start(); Handler(it.looper) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt index b187dba488..1c6886ccd8 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt @@ -3,13 +3,44 @@ package com.zhjt.mogo_core_function_devatools.mofang import android.os.* import android.util.* import android.view.KeyEvent +import com.mogo.commons.utils.MogoAnalyticUtils import com.mogo.eagle.core.data.config.* +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.* +import com.zhjt.mogo.adas.data.bean.MogoReport.Code.Info.IMF import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_SUB_KEYCODE -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_SUB_TYPE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_ACC +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_CODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_HEADING +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LAT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LINE_ID +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LON +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_MSG +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_NODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_SPEED +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_ACC +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_CODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_HEADING +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LAT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LINE_ID +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LON +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_MSG +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_NODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_SPEED +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_PARAMS_ACC +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_PARAMS_HEADING +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_PARAMS_KEYCODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_PARAMS_LAT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_PARAMS_LINE_ID +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_PARAMS_LON +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_PARAMS_SPEED +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_PARAMS_TYPE +import mogo_msg.MogoReportMsg +import java.util.concurrent.atomic.AtomicBoolean internal class MoFangCommandExecutor { @@ -32,9 +63,51 @@ internal class MoFangCommandExecutor { this.linkedLog = log } + private val isRegister by lazy { AtomicBoolean(false) } + + private val listener = object : IMoGoAutopilotStatusListener { + + override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { + super.onAutopilotGuardian(guardianInfo) + guardianInfo?.also { + when (it.code) { + IMF.SPEED_CHANGE_RECEIVE -> { + reportIPCReceive(it.src, it.code, it.msg) + } + IMF.SPEED_CHANGE_EXECUTE -> { + reportIPCExecute(it.src, it.code, it.msg) + } + IMF.SPEED_RESET_RECEIVE -> { + reportIPCReceive(it.src, it.code, it.msg) + } + IMF.SPEED_RESET_EXECUTE -> { + reportIPCExecute(it.src, it.code, it.msg) + } + IMF.LAN_CHANG_RECEIVE -> { + reportIPCReceive(it.src, it.code, it.msg) + } + IMF.LAN_CHANG_EXECUTE -> { + reportIPCExecute(it.src, it.code, it.msg) + } + IMF.HORN_RECEIVE -> { + reportIPCReceive(it.src, it.code, it.msg) + } + IMF.HORN_EXECUTE -> { + reportIPCExecute(it.src, it.code, it.msg) + } + } + } + + } + } + private val handlerCallback = Handler.Callback { msg -> + if (isRegister.compareAndSet(false, true)) { + CallerAutoPilotStatusListenerManager.addListener(TAG, listener) + } val message = whatToString(msg.what, ", msg_info:[obj:${msg.obj}, arg1: ${msg.arg1}, arg2: ${msg.arg2}]") linkedLog?.record(mapOf("收到:${System.currentTimeMillis()}" to "$message")) + val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() when(msg.what) { MSG_WHAT_KEY_CODE_A, MSG_WHAT_KEY_CODE_B, MSG_WHAT_KEY_CODE_AB, MSG_WHAT_KEY_CODE_AL -> { var send = false @@ -42,7 +115,16 @@ internal class MoFangCommandExecutor { val acc = msg.obj as? Double if (acc != null) { send = acc != 0.0 - MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf( + EVENT_EXECUTE_PARAMS_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_TYPE to (getInputTypeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_LON to location.longitude, + EVENT_EXECUTE_PARAMS_LAT to location.latitude, + EVENT_EXECUTE_PARAMS_SPEED to location.gnssSpeed, + EVENT_EXECUTE_PARAMS_ACC to location.acceleration, + EVENT_EXECUTE_PARAMS_HEADING to location.heading, + EVENT_EXECUTE_PARAMS_LINE_ID to CallerAutoPilotStatusListenerManager.getLineId() + )) linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $acc")) CallerAutoPilotControlManager.sendOperatorSetAcceleratedSpeed(acc) } @@ -61,7 +143,16 @@ internal class MoFangCommandExecutor { return@Callback true } val isLeft = msg.arg1 == -1 - MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf( + EVENT_EXECUTE_PARAMS_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_TYPE to (getInputTypeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_LON to location.longitude, + EVENT_EXECUTE_PARAMS_LAT to location.latitude, + EVENT_EXECUTE_PARAMS_SPEED to location.gnssSpeed, + EVENT_EXECUTE_PARAMS_ACC to location.acceleration, + EVENT_EXECUTE_PARAMS_HEADING to location.heading, + EVENT_EXECUTE_PARAMS_LINE_ID to CallerAutoPilotStatusListenerManager.getLineId() + )) if (isLeft) { linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message")) Log.d(TAG, "--- 左变道执行了 ----") @@ -81,7 +172,16 @@ internal class MoFangCommandExecutor { val autoPilotStatusInfo = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo() val parameters = autoPilotStatusInfo.autopilotControlParameters val json = GsonUtil.jsonFromObject(parameters) - MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf( + EVENT_EXECUTE_PARAMS_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_TYPE to (getInputTypeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_LON to location.longitude, + EVENT_EXECUTE_PARAMS_LAT to location.latitude, + EVENT_EXECUTE_PARAMS_SPEED to location.gnssSpeed, + EVENT_EXECUTE_PARAMS_ACC to location.acceleration, + EVENT_EXECUTE_PARAMS_HEADING to location.heading, + EVENT_EXECUTE_PARAMS_LINE_ID to CallerAutoPilotStatusListenerManager.getLineId() + )) linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $json")) Log.d(TAG, "--- 启动自驾 ----入参:$json") //清扫车有FSM模块,魔方启动自驾时需要将Source修改为魔方,以便telamatics做区分并在转发时增加flag标记 @@ -103,7 +203,16 @@ internal class MoFangCommandExecutor { if (value != null && value != 0.0) { send = value != 2.0 Log.d(TAG, "--- 长按鸣笛 ---入参:$value") - MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf( + EVENT_EXECUTE_PARAMS_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_TYPE to (getInputTypeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_LON to location.longitude, + EVENT_EXECUTE_PARAMS_LAT to location.latitude, + EVENT_EXECUTE_PARAMS_SPEED to location.gnssSpeed, + EVENT_EXECUTE_PARAMS_ACC to location.acceleration, + EVENT_EXECUTE_PARAMS_HEADING to location.heading, + EVENT_EXECUTE_PARAMS_LINE_ID to CallerAutoPilotStatusListenerManager.getLineId() + )) linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $value")) CallerAutoPilotControlManager.sendOperatorSetHorn(value) } @@ -300,4 +409,159 @@ internal class MoFangCommandExecutor { } return false } + + private fun reportIPCReceive(node: String?, code: String, message: String?) { + try { + val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + when (code) { + IMF.HORN_RECEIVE -> { + MogoAnalyticUtils.track(EVENT_EXECUTE_FEEDBACK_RECEIVE, mutableMapOf().also { + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_NODE] = node ?: "" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_CODE] = "E2" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_MSG] = message ?: "" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LON] = location.longitude + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LAT] = location.latitude + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_ACC] = location.acceleration + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_SPEED] = location.gnssSpeed + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_HEADING] = location.heading + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LINE_ID] = CallerAutoPilotStatusListenerManager.getLineId() + }) + } + + IMF.LAN_CHANG_RECEIVE -> { + if (message != null && message.contains("$$")) { + val isLeft = message.substringBefore("$$") == "-1" + MogoAnalyticUtils.track(EVENT_EXECUTE_FEEDBACK_RECEIVE, mutableMapOf().also { + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_NODE] = node ?: "" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_CODE] = if (isLeft) "C1" else "D1" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_MSG] = message + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LON] = location.longitude + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LAT] = location.latitude + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_ACC] = location.acceleration + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_SPEED] = location.gnssSpeed + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_HEADING] = location.heading + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LINE_ID] = CallerAutoPilotStatusListenerManager.getLineId() + }) + } + } + + IMF.SPEED_RESET_RECEIVE -> { + MogoAnalyticUtils.track(EVENT_EXECUTE_FEEDBACK_RECEIVE, mutableMapOf().also { + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_NODE] = node ?: "" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_CODE] = "B1" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_MSG] = message ?: "" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LON] = location.longitude + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LAT] = location.latitude + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_ACC] = location.acceleration + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_SPEED] = location.gnssSpeed + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_HEADING] = location.heading + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LINE_ID] = CallerAutoPilotStatusListenerManager.getLineId() + }) + } + + + IMF.SPEED_CHANGE_RECEIVE -> { + if (message != null && message.contains("$$")) { + val isSpeedUp = try { + message.substringBefore("$$").toFloat() > 0f + } catch (ignore: Throwable) { + null + } + if (isSpeedUp != null) { + MogoAnalyticUtils.track(EVENT_EXECUTE_FEEDBACK_RECEIVE, mutableMapOf().also { + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_NODE] = node ?: "" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_CODE] = if (isSpeedUp) "AB" else "A1" + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_MSG] = message + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LON] = location.longitude + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LAT] = location.latitude + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_ACC] = location.acceleration + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_SPEED] = location.gnssSpeed + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_HEADING] = location.heading + it[EVENT_EXECUTE_FEEDBACK_RECEIVE_PARAMS_LINE_ID] = CallerAutoPilotStatusListenerManager.getLineId() + }) + } + } + } + } + } catch (t: Throwable) { + t.printStackTrace() + } + } + + private fun reportIPCExecute(node:String?, code: String, message: String?) { + try { + val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + when (code) { + IMF.HORN_EXECUTE -> { + MogoAnalyticUtils.track(EVENT_EXECUTE_FEEDBACK_EXECUTE, mutableMapOf().also { + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_NODE] = node ?: "" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_CODE] = "E2" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_MSG] = message ?: "" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LON] = location.longitude + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LAT] = location.latitude + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_ACC] = location.acceleration + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_SPEED] = location.gnssSpeed + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_HEADING] = location.heading + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LINE_ID] = CallerAutoPilotStatusListenerManager.getLineId() + }) + } + + IMF.LAN_CHANG_EXECUTE -> { + if (message != null && message.contains("$$")) { + val isLeft = message.substringBefore("$$") == "-1" + MogoAnalyticUtils.track(EVENT_EXECUTE_FEEDBACK_EXECUTE, mutableMapOf().also { + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_NODE] = node ?: "" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_CODE] = if (isLeft) "C1" else "D1" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_MSG] = message + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LON] = location.longitude + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LAT] = location.latitude + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_ACC] = location.acceleration + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_SPEED] = location.gnssSpeed + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_HEADING] = location.heading + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LINE_ID] = CallerAutoPilotStatusListenerManager.getLineId() + }) + } + } + + IMF.SPEED_RESET_EXECUTE -> { + MogoAnalyticUtils.track(EVENT_EXECUTE_FEEDBACK_EXECUTE, mutableMapOf().also { + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_NODE] = node ?: "" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_CODE] = "B1" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_MSG] = message ?: "" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LON] = location.longitude + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LAT] = location.latitude + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_ACC] = location.acceleration + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_SPEED] = location.gnssSpeed + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_HEADING] = location.heading + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LINE_ID] = CallerAutoPilotStatusListenerManager.getLineId() + }) + } + IMF.SPEED_CHANGE_EXECUTE -> { + if (message != null && message.contains("$$")) { + val isSpeedUp = try { + message.substringBefore("$$").toFloat() > 0f + } catch (ignore: Throwable) { + null + } + + if (isSpeedUp != null) { + MogoAnalyticUtils.track(EVENT_EXECUTE_FEEDBACK_EXECUTE, mutableMapOf().also { + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_NODE] = node ?: "" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_CODE] = if (isSpeedUp) "AB" else "A1" + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_MSG] = message + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LON] = location.longitude + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LAT] = location.latitude + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_ACC] = location.acceleration + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_SPEED] = location.gnssSpeed + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_HEADING] = location.heading + it[EVENT_EXECUTE_FEEDBACK_EXECUTE_PARAMS_LINE_ID] = CallerAutoPilotStatusListenerManager.getLineId() + }) + } + } + } + } + } catch (t: Throwable) { + t.printStackTrace() + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangLinkedLog.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangLinkedLog.kt index 5018c98c57..4c3354d0cd 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangLinkedLog.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangLinkedLog.kt @@ -14,7 +14,7 @@ internal class MoFangLinkedLog { } @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_HMI, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_HMI, nodeAliasCode = ChainConstant.CHAIN_CODE_MO_FANG_CONNECT, paramIndexes = [0] diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt index 309972293c..96e995ac69 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt @@ -5,6 +5,7 @@ import android.app.* import android.bluetooth.* import android.graphics.* import android.graphics.drawable.ColorDrawable +import android.os.SystemClock import android.util.* import android.view.* import android.view.Window.Callback @@ -23,21 +24,22 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY_VALUE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY_PARAMS_DUR +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY_PARAMS_VALUE import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_SUB_KEYCODE -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_SUB_TYPE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_PARAMS_KEYCODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_PARAMS_TYPE import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_BLUETOOTH_OPEN_AGREE -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_BLUETOOTH_OPEN_DENY -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_BLUETOOTH_SETTING_REQ -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_CONNECT_SUCCESS -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_DISCONNECT_SLEEP -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_DISCONNECT_SUCCESS -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_IS_INVALID -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_IS_VALID -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_START_CONNECT -import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_START_DISCONNECT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_OPEN_AGREE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_OPEN_DENY +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_SETTING_REQ +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_CONNECT_SUCCESS +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_DISCONNECT_SLEEP +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_DISCONNECT_SUCCESS +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_IS_INVALID +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_IS_VALID +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_START_CONNECT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT_PARAMS_START_DISCONNECT import kotlinx.coroutines.* import me.jessyan.autosize.utils.AutoSizeUtils import java.util.concurrent.ConcurrentHashMap @@ -63,6 +65,8 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen private var job: Job? = null + private var batteryTime : Long = -1 + override fun enableTest(enable: Boolean) { isTest.set(enable) SPUtils.getInstance().put(SP_KEY_TEST_ENABLE, enable) @@ -85,7 +89,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } override fun onBluetoothStartConnect() { - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_START_CONNECT to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_START_CONNECT to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("connect" to "real-start")) } @@ -102,7 +106,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen override fun disconnect() { try { - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_START_DISCONNECT to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_START_DISCONNECT to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("disconnect" to "start")) MoFangManager.disconnect() linkedLog.record(mapOf("disconnect" to "success")) @@ -142,7 +146,13 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen override fun onBluetoothBatteryChanged(battery: Int) { linkedLog.record(mapOf("callback" to "onBluetoothBatteryChanged:$battery")) - MoFangAnalyticUtils.track(EVENT_BATTERY, mutableMapOf(EVENT_BATTERY_VALUE to "$battery")) + val now = SystemClock.elapsedRealtime() + val dur = if (batteryTime < 0) 0 else (now - batteryTime) + batteryTime = now + MoFangAnalyticUtils.track(EVENT_BATTERY, mutableMapOf( + EVENT_BATTERY_PARAMS_VALUE to "$battery", + EVENT_BATTERY_PARAMS_DUR to dur + )) UiThreadHandler.post { listeners.values.forEach { it.onMoFangBatteryChanged(battery) @@ -157,7 +167,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } catch (t: Throwable) { t.printStackTrace() } - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_CONNECT_SUCCESS to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_CONNECT_SUCCESS to "${System.currentTimeMillis()}")) UiThreadHandler.post { listeners.values.forEach { it.onMoFangConnected() @@ -172,7 +182,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } catch (t: Throwable) { t.printStackTrace() } - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_DISCONNECT_SUCCESS to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_DISCONNECT_SUCCESS to "${System.currentTimeMillis()}")) UiThreadHandler.post { listeners.values.forEach { it.onMoFangDisconnected() @@ -186,7 +196,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen showToast("[$keycodesText]") } try { - MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keycodesText, EVENT_INPUT_SUB_TYPE to "3")) + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_PARAMS_KEYCODE to keycodesText, EVENT_INPUT_PARAMS_TYPE to "3")) linkedLog.record(mapOf("command" to "combine_clicked: $keycodesText")) executor.handleCombineClick(*keyCodes) } finally { @@ -202,7 +212,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen showToast("[$key$key]") } try { - MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keyCode.toString(), EVENT_INPUT_SUB_TYPE to "2")) + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_PARAMS_KEYCODE to keyCode.toString(), EVENT_INPUT_PARAMS_TYPE to "2")) linkedLog.record(mapOf("command" to "long_clicked: ${ KeyEvent.keyCodeToString(keyCode) }")) executor.handleLongClick(keyCode) } finally { @@ -220,7 +230,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen showToast("[${keycodeText.replace("KEYCODE_", "", true)}]") } try { - MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keyCode.toString(), EVENT_INPUT_SUB_TYPE to "1")) + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_PARAMS_KEYCODE to keyCode.toString(), EVENT_INPUT_PARAMS_TYPE to "1")) linkedLog.record(mapOf("command" to "clicked: $keycodeText")) executor.handleSingleClick(keyCode) } finally { @@ -269,7 +279,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen override fun onBluetoothKeyboardInputInvalid() { CallerLogger.d(M_DEVA+TAG, "--- onBluetoothKeyboardInputInvalid ---") - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_IS_INVALID to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_IS_INVALID to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("callback" to "onBluetoothKeyboardInputInvalid")) UiThreadHandler.post { listeners.values.forEach { @@ -280,25 +290,25 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen override fun onBluetoothKeyboardInputValid() { CallerLogger.d(M_DEVA+TAG, "--- onBluetoothKeyboardInputValid ---") - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_IS_VALID to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_IS_VALID to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("callback" to "onBluetoothKeyboardInputValid")) } override fun onBluetoothOpenAgreed() { CallerLogger.d(M_DEVA+TAG, "--- onBluetoothOpenAgreed ---") - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_BLUETOOTH_OPEN_AGREE to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_OPEN_AGREE to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("callback" to "onBluetoothOpenAgreed")) } override fun onBluetoothOpenDenied() { CallerLogger.d(M_DEVA+TAG, "--- onBluetoothOpenDenied ---") - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_BLUETOOTH_OPEN_DENY to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_OPEN_DENY to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("callback" to "onBluetoothOpenDenied")) } override fun onBluetoothSettingRequest() { CallerLogger.d(M_DEVA+TAG, "--- onBluetoothSettingRequest ---") - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_BLUETOOTH_SETTING_REQ to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_SETTING_REQ to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("callback" to "onBluetoothSettingRequest")) UiThreadHandler.post { Toast.makeText(Utils.getApp(), "检测到魔方未正确连接,请在系统蓝牙设置页面,找到魔方并配对连接...", Toast.LENGTH_SHORT).show() @@ -307,7 +317,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen override fun onBluetoothKeyboardAbnormalDisconnected(status: Int) { CallerLogger.d(M_DEVA+TAG, "--- onBluetoothKeyboardAbnormalDisconnected(status: $status) ---") - MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_DISCONNECT_SLEEP to "${System.currentTimeMillis()}")) + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_MOFANG_CONNECT_PARAMS_DISCONNECT_SLEEP to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("callback" to "onBluetoothKeyboardAbnormalDisconnected:$status")) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/monitor/remote/RemoteUserServiceImp.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/monitor/remote/RemoteUserServiceImp.java index d9f1d3487a..8ca36552ad 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/monitor/remote/RemoteUserServiceImp.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/monitor/remote/RemoteUserServiceImp.java @@ -60,8 +60,10 @@ public class RemoteUserServiceImp extends Binder implements IUserInterface { String _arg0; _arg0 = data.readString(); String _result = this.exec(_arg0); - reply.writeNoException(); - reply.writeString(_result); + if (reply != null) { + reply.writeNoException(); + reply.writeString(_result); + } return true; default: return super.onTransact(code, data, reply, flags); diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt index 71dec64930..d46fb86471 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt @@ -49,7 +49,7 @@ class SceneManager { //过滤所需条件 sceneModuleTAG.map[ADAS] = SceneModule(true, M_D_C) sceneModuleTAG.map[DEVA] = SceneModule(true, M_DEVA) - sceneModuleTAG.map[HMI] = SceneModule(false, M_HMI) + sceneModuleTAG.map[HMI] = SceneModule(true, M_HMI) sceneModuleTAG.map[OBU] = SceneModule(true, M_OBU) sceneModuleTAG.map[V2X] = SceneModule(true, M_V2X) sceneModuleTAG.map[MAP] = SceneModule(true, M_MAP) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt index e5464fd9d1..da26ec4642 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt @@ -51,7 +51,7 @@ object SyncConfig { } @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_INIT_STATUS, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_INIT, nodeAliasCode = ChainConstant.CHAIN_CODE_APP_INFO_CONFIG_UPDATE, paramIndexes = [0] diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt index ecf880c9c6..0f53e12065 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt @@ -3,7 +3,6 @@ package com.zhjt.mogo_core_function_devatools.trace import android.content.Context import android.os.Handler import android.os.Looper -import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.chain.ChainLogParam import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener @@ -58,7 +57,7 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { CallerAutopilotCarConfigListenerManager.addListener(TAG, this) // Trace过程中进行日志抓取,对日志进行配置 - fwBuildMap[ChainConstant.CHAIN_TYPE_INIT_STATUS] = + fwBuildMap[ChainConstant.CHAIN_TYPE_STATUS] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_INIT) fwBuildMap[ChainConstant.CHAIN_TYPE_GNSS] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_GNSS) @@ -72,8 +71,6 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { FwBuild(false, 30, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_VEHICLE) fwBuildMap[ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_TRAFFIC_LIGHT) - fwBuildMap[ChainConstant.CHAIN_TYPE_HMI] = - FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_HMI_ACTIONS) fwBuildMap[ChainConstant.CHAIN_TYPE_ANR_LEAK] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_ANR) fwBuildMap[ChainConstant.CHAIN_TYPE_V2X] = @@ -86,7 +83,7 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_OCH) - traceInfoCache[ChainConstant.CHAIN_TYPE_INIT_STATUS] = + traceInfoCache[ChainConstant.CHAIN_TYPE_STATUS] = ChainLogParam(true, "INIT状态") traceInfoCache[ChainConstant.CHAIN_TYPE_GNSS] = ChainLogParam(true, "ADAS自车定位") @@ -100,8 +97,6 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { ChainLogParam(false, "ADAS车辆底盘数据") traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT] = ChainLogParam(true, "红绿灯Union数据") - traceInfoCache[ChainConstant.CHAIN_TYPE_HMI] = - ChainLogParam(true, "人机交互行为") traceInfoCache[ChainConstant.CHAIN_TYPE_ANR_LEAK] = ChainLogParam(true, "ANR Record") traceInfoCache[ChainConstant.CHAIN_TYPE_V2X] = @@ -156,7 +151,7 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { fun refreshTraceInfo(map: HashMap) { map.forEach { (type, param) -> - if (type != ChainConstant.CHAIN_TYPE_INIT_STATUS) { + if (type != ChainConstant.CHAIN_TYPE_STATUS) { val fwBuild = this.fwBuildMap[type] fwBuild?.let { CallerLogger.d("$M_DEVA$TAG", "param : ${param.des} , record : ${param.record}") diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt index b0219909a7..cd1ac45a4a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt @@ -29,7 +29,6 @@ import kotlinx.coroutines.* import java.io.IOException import java.util.concurrent.ConcurrentHashMap -//todo emArrow trace class UpgradeManager : IDownloadListener { companion object { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt index 2eece707f1..c0eaca9ef1 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt @@ -301,7 +301,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_INIT_STATUS, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, nodeAliasCode = ChainConstant.CHAIN_CODE_UPGRADE_APP, paramIndexes = [0] diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 238cd8709e..6df031e493 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -75,6 +75,8 @@ dependencies { implementation rootProject.ext.dependencies.koomjava implementation rootProject.ext.dependencies.koomnative implementation rootProject.ext.dependencies.koomxhook + + implementation rootProject.ext.dependencies.thread_opt api project(':test:crashreport-apmbyte') compileOnly project(':core:function-impl:mogo-core-function-datacenter') implementation project(':foudations:mogo-commons') diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml index 90ee278539..f3f3138647 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml @@ -54,14 +54,13 @@ --> @@ -97,21 +96,6 @@ - - - - - - - - - - - - - - - --> - - diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt index d05fa0a36f..6b18a2f8ad 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt @@ -3,11 +3,12 @@ package com.mogo.eagle.core.function.hmi.notification.anim import android.animation.Animator import android.animation.ValueAnimator import android.graphics.Rect -import android.util.Log import android.view.View import android.view.WindowManager import com.mogo.eagle.core.data.enums.SidePattern import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatAnimator +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.BarUtils import kotlin.math.min @@ -52,7 +53,7 @@ open class DefaultAnimator : OnFloatAnimator { windowManager.updateViewLayout(view, params) } catch (e: Exception) { cancel() - Log.i("DebugViewSwitchLog", "执行动画异常,异常原因:"+e) + CallerLogger.i(M_HMI + "DebugViewSwitchLog", "执行动画异常,异常原因:$e") } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index bd4506b7a4..acd2b757ae 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -2,13 +2,11 @@ package com.mogo.eagle.core.function.hmi.ui import android.content.Context import android.text.TextUtils -import android.util.* import android.view.* import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.commons.voice.AIAssist -import com.mogo.commons.voice.IMogoVoiceCmdCallBack import com.mogo.eagle.core.data.deva.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths.PATH_FRAGMENT_HMI @@ -39,7 +37,6 @@ import com.mogo.eagle.core.function.hmi.ui.tools.ModifyBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.tools.ToBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.tools.UpgradeAppDialog import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog -import com.mogo.eagle.core.function.hmi.ui.vehicle.TurnLightViewStatus import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView import com.mogo.eagle.core.utilcode.floating.* import com.mogo.eagle.core.utilcode.kotlin.safeCancel @@ -47,9 +44,10 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.* +import com.mogo.tts.base.IMogoTTSCallback import com.zhjt.service_biz.BizConfig import kotlinx.coroutines.* -import kotlinx.coroutines.selects.* +import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference /** @@ -64,7 +62,6 @@ class MoGoHmiProvider : IMoGoHmiProvider { private const val TAG = "MoGoHmiProvider" } - private val lastSpeakJob by lazy { AtomicReference() } private var lastShowV2XJob: Job? = null private var context: Context? = null @@ -73,7 +70,8 @@ class MoGoHmiProvider : IMoGoHmiProvider { */ private val lookAround by lazy { AtomicReference() } - private val scope by lazy { CoroutineScope(Dispatchers.Default + SupervisorJob()) } + private val isPlayingTts by lazy { AtomicBoolean(false) } + override fun init(context: Context?) { this.context = context @@ -145,66 +143,27 @@ class MoGoHmiProvider : IMoGoHmiProvider { }.invokeOnCompletion { listener?.onDismiss() } - Log.d("CODE", "---- 00 ------ tts_content: $ttsContent") - if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) { - val last = lastSpeakJob.get() - Log.d("CODE", "---- 0 ------: last: $last") - if (last != null && !last.isCompleted) { - Log.d("CODE", "---- 1 ------") - return - } - scope.launch { - Log.d("CODE", "---- 2 ------") - val d1 = async { - Log.d("CODE", "---- 2_1 start ------") - speak(it, ttsContent) - Log.d("CODE", "---- 2_1 end ------") - } - val d2 = async { - Log.d("CODE", "---- 2_2 start ------") - delay((305.75 * ttsContent.length).toLong()) - Log.d("CODE", "---- 2_2 end ------") - } - val ret = select { - d1.onAwait { 1 } - d2.onAwait { 2 } - } - if (ret == 1) { - d2.cancel() - Log.d("CODE", "---- 3 ------") - } else { - d1.cancel() - Log.d("CODE", "---- 4 ------") - } - }.also { itx -> - lastSpeakJob.set(itx) + if (!isPlayingTts.get() && ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) { + context?.also { + AIAssist.getInstance(it).speakTTSVoiceWithLevel(ttsContent, AIAssist.LEVEL2, object : IMogoTTSCallback { + + override fun onSpeakEnd(speakText: String?) { + super.onSpeakEnd(speakText) + isPlayingTts.set(false) + } + + override fun onSpeakError(speakText: String?, errorMsg: String?) { + super.onSpeakError(speakText, errorMsg) + isPlayingTts.set(false) + } + }) + isPlayingTts.set(true) } + } } } - private suspend fun speak(ctx: Context, text: String) = suspendCancellableCoroutine { - try { - val voiceCallback = object : IMogoVoiceCmdCallBack { - override fun onSpeakEnd(speakText: String?) { - super.onSpeakEnd(speakText) - it.resumeWith(Result.success(Unit)) - } - - override fun onSpeakError(speakText: String?, errorMsg: String?) { - super.onSpeakError(speakText, errorMsg) - it.resumeWith(Result.success(Unit)) - } - } - it.invokeOnCancellation { - AIAssist.getInstance(ctx).stopSpeakTts(text) - } - AIAssist.getInstance(ctx).speakTTSVoiceWithLevel(text, AIAssist.LEVEL2, voiceCallback) - } catch (t: Throwable) { - it.resumeWith(Result.success(Unit)) - CallerLogger.w("$M_HMI$TAG", t.message) - } - } override fun showWarning(v2xType: String, direction: WarningDirectionEnum, expireTime: Long) { //CallerV2XWarningListenerManager.show(v2xType, direction, expireTime) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogItemAdapter.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogItemAdapter.java index 36f3e02cd4..fdc64291f1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogItemAdapter.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogItemAdapter.java @@ -249,11 +249,7 @@ public class LogItemAdapter extends AbsRecyclerAdapter, L protected void publishResults(CharSequence constraint, FilterResults results) { //noinspection unchecked mList = (List) results.values; - if (results.count > 0) { - notifyDataSetChanged(); - } else { - notifyDataSetChanged(); - } + notifyDataSetChanged(); } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogLine.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogLine.java index 8c858e6526..cf670d49ae 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogLine.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogLine.java @@ -25,6 +25,7 @@ public class LogLine { "\\): "); private static final String filterPattern = "ResourceType|memtrack|android.os.Debug|BufferItemConsumer|DPM.*|MDM.*|ChimeraUtils|BatteryExternalStats.*|chatty.*|DisplayPowerController|WidgetHelper|WearableService|DigitalWidget.*|^ANDR-PERF-.*"; + private static final String failPattern = "(^maxLineHeight.*)|(Failed to read.*)"; private int logLevel; private String tag; private String logOutput; @@ -57,7 +58,7 @@ public class LogLine { char logLevelChar = matcher.group(1).charAt(0); String logText = originalLine.substring(matcher.end()); - if (logText.matches("^maxLineHeight.*|Failed to read.*")) { + if (logText.matches(failPattern)) { logLine.setLogLevel(convertCharToLogLevel('V')); } else { logLine.setLogLevel(convertCharToLogLevel(logLevelChar)); diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt index d32188bbfe..c1bde36d11 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt @@ -95,7 +95,6 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas handler.set(HandlerThread("look-around-drawer").let { it.start(); Handler(it.looper) }) } handler.get()?.removeCallbacks(this) - handler.get()?.post(this) isSurfaceValid = true } @@ -109,187 +108,171 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas } override fun run() { - var isTimedBlock = false + if (!isSurfaceValid) { + return + } + if (this.surfaceWidth <= 0 || this.surfaceHeight <= 0) { + return + } + val data = this.data ?: return + val targetX = data.targetX + val targetY = data.targetY + val targetWidth = data.targetWidth + val targetHeight = data.targetHeight + val bitmapWidth = data.bitmapWidth + val bitmapHeight = data.bitmapHeight + val scaleX = this.surfaceWidth * 1.0f / bitmapWidth + val scaleY = this.surfaceHeight * 1.0f / bitmapHeight + val bytes = data.data ?: return + val canvas = holder.lockCanvas() try { - if (!isSurfaceValid) { - isTimedBlock = true + if (canvas == null) { return } - if (this.surfaceWidth <= 0 || this.surfaceHeight <= 0) { - isTimedBlock = true - return - } - val data = this.data ?: return - val targetX = data.targetX - val targetY = data.targetY - val targetWidth = data.targetWidth - val targetHeight = data.targetHeight - val bitmapWidth = data.bitmapWidth - val bitmapHeight = data.bitmapHeight - val scaleX = this.surfaceWidth * 1.0f / bitmapWidth - val scaleY = this.surfaceHeight * 1.0f / bitmapHeight - val bytes = data.data - if (bytes == null) { - isTimedBlock = true - return - } - val canvas = holder.lockCanvas() + //1. 绘制图片 + val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: return try { - if (canvas == null) { - isTimedBlock = true - return + canvas.save() + canvas.scale(scaleX, scaleY) + canvas.drawBitmap(bitmap, 0f, 0f, bitmapPaint) + } finally { + canvas.restore() + if (!bitmap.isRecycled) { + bitmap.recycle() } - //1. 绘制图片 - val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) - if (bitmap == null) { - isTimedBlock = true - return + } + //2. 绘制车的信息 + val newTargetX = targetX * scaleX + val newTargetY = targetY * scaleY + val newTargetWidth = targetWidth * scaleX + val newTargetHeight = targetHeight * scaleY + try { + //2.1 绘制车前的转向角 + canvas.save() + var steering = this.steering + if (abs(steering) < 1) { + steering = 0f } - try { - canvas.save() - canvas.scale(scaleX, scaleY) - canvas.drawBitmap(bitmap, 0f, 0f, bitmapPaint) - } finally { - canvas.restore() - if (!bitmap.isRecycled) { - bitmap.recycle() - } - } - //2. 绘制车的信息 - val newTargetX = targetX * scaleX - val newTargetY = targetY * scaleY - val newTargetWidth = targetWidth * scaleX - val newTargetHeight = targetHeight * scaleY - try { - //2.1 绘制车前的转向角 - canvas.save() - var steering = this.steering - if (abs(steering) < 1) { - steering = 0f - } - if (steering == 0f) { - canvas.translate(newTargetX + newTargetWidth * 0.5f, newTargetY) - routerPath.reset() - val halfX = newTargetWidth * 0.5f - var startX = - halfX - val startY= 0f - routerPath.moveTo(startX, startY) - var endX = startX - val endY = - newTargetY - routerPath.lineTo(endX, endY) - canvas.drawPath(routerPath, routerPaint) - startX += newTargetWidth - endX += newTargetWidth - routerPath.reset() - routerPath.moveTo(startX, startY) - routerPath.lineTo(endX, endY) - canvas.drawPath(routerPath, routerPaint) - } else { - val outerAngle = abs(steering * 1.0 / VEHICLE_STEERING_RATIO) - val radians = Math.toRadians(outerAngle) - val d = (newTargetHeight / tan(radians)).toFloat() - if (steering > 0) { - // 左打轮 - // 将坐标原点平移到圆心 - canvas.translate(newTargetX - (d - newTargetWidth), newTargetY + newTargetHeight) - //外圆半径 - val outerR = (newTargetHeight / sin(radians)).toFloat() - //内圆半径 - val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat() - val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0) - outerRect.set(-outerR, -outerR, outerR, outerR) - innerRect.set(-innerR, -innerR, innerR, innerR) - canvas.drawArc(outerRect, -outerAngle.toFloat(), -60f, false, routerPaint) - canvas.drawArc(innerRect, -innerAngle.toFloat(), -60f, false, routerPaint) - } - - if (steering < 0) { - //右打轮 - // 将坐标原点平移到圆心 - canvas.translate(newTargetX + d, newTargetY + newTargetHeight) - //外圆半径 - val outerR = (newTargetHeight / sin(radians)).toFloat() - //内圆半径 - val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat() - val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0) - outerRect.set(-outerR, -outerR, outerR, outerR) - innerRect.set(-innerR, -innerR, innerR, innerR) - canvas.drawArc(outerRect, 180f + outerAngle.toFloat(), 60f, false, routerPaint) - canvas.drawArc(innerRect, 180f + innerAngle.toFloat(), 60f, false, routerPaint) - } - } - } finally { - canvas.restore() - } - - try { - //2.2 绘制车周围盲区标定 - canvas.save() + if (steering == 0f) { canvas.translate(newTargetX + newTargetWidth * 0.5f, newTargetY) - val halfTargetWidth = newTargetWidth * 0.5f - var startX = -halfTargetWidth - var startY = BROKE_LINE_LENGTH + routerPath.reset() + val halfX = newTargetWidth * 0.5f + var startX = - halfX + val startY= 0f + routerPath.moveTo(startX, startY) var endX = startX - var endY = 0f - // 绘制左上角 - brokePath.reset() - brokePath.moveTo(startX, startY) - brokePath.lineTo(endX, endY) - endX += BROKE_LINE_LENGTH - brokePath.lineTo(endX, endY) - canvas.drawPath(brokePath, brokePaint) + val endY = - newTargetY + routerPath.lineTo(endX, endY) + canvas.drawPath(routerPath, routerPaint) + startX += newTargetWidth + endX += newTargetWidth + routerPath.reset() + routerPath.moveTo(startX, startY) + routerPath.lineTo(endX, endY) + canvas.drawPath(routerPath, routerPaint) + } else { + val outerAngle = abs(steering * 1.0 / VEHICLE_STEERING_RATIO) + val radians = Math.toRadians(outerAngle) + val d = (newTargetHeight / tan(radians)).toFloat() + if (steering > 0) { + // 左打轮 + // 将坐标原点平移到圆心 + canvas.translate(newTargetX - (d - newTargetWidth), newTargetY + newTargetHeight) + //外圆半径 + val outerR = (newTargetHeight / sin(radians)).toFloat() + //内圆半径 + val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat() + val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0) + outerRect.set(-outerR, -outerR, outerR, outerR) + innerRect.set(-innerR, -innerR, innerR, innerR) + canvas.drawArc(outerRect, -outerAngle.toFloat(), -60f, false, routerPaint) + canvas.drawArc(innerRect, -innerAngle.toFloat(), -60f, false, routerPaint) + } - // 绘制右上角 - startX = halfTargetWidth - BROKE_LINE_LENGTH - startY = 0f - - endX = halfTargetWidth - endY = 0f - brokePath.reset() - brokePath.moveTo(startX, startY) - brokePath.lineTo(endX, endY) - endY += BROKE_LINE_LENGTH - brokePath.lineTo(endX, endY) - canvas.drawPath(brokePath, brokePaint) - - //绘制左下角 - startX = -halfTargetWidth - startY = newTargetHeight - BROKE_LINE_LENGTH - endX = startX - endY = newTargetHeight - brokePath.reset() - brokePath.moveTo(startX, startY) - brokePath.lineTo(endX, endY) - endX += BROKE_LINE_LENGTH - brokePath.lineTo(endX, endY) - canvas.drawPath(brokePath, brokePaint) - - //绘制右下角 - startX = halfTargetWidth - BROKE_LINE_LENGTH - startY = newTargetHeight - endX = halfTargetWidth - endY = startY - brokePath.reset() - brokePath.moveTo(startX, startY) - brokePath.lineTo(endX, endY) - endY -= BROKE_LINE_LENGTH - brokePath.lineTo(endX, endY) - canvas.drawPath(brokePath, brokePaint) - } finally { - canvas.restore() + if (steering < 0) { + //右打轮 + // 将坐标原点平移到圆心 + canvas.translate(newTargetX + d, newTargetY + newTargetHeight) + //外圆半径 + val outerR = (newTargetHeight / sin(radians)).toFloat() + //内圆半径 + val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat() + val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0) + outerRect.set(-outerR, -outerR, outerR, outerR) + innerRect.set(-innerR, -innerR, innerR, innerR) + canvas.drawArc(outerRect, 180f + outerAngle.toFloat(), 60f, false, routerPaint) + canvas.drawArc(innerRect, 180f + innerAngle.toFloat(), 60f, false, routerPaint) + } } } finally { - if (canvas != null) { - holder.unlockCanvasAndPost(canvas) - } + canvas.restore() + } + + try { + //2.2 绘制车周围盲区标定 + canvas.save() + canvas.translate(newTargetX + newTargetWidth * 0.5f, newTargetY) + val halfTargetWidth = newTargetWidth * 0.5f + var startX = -halfTargetWidth + var startY = BROKE_LINE_LENGTH + var endX = startX + var endY = 0f + // 绘制左上角 + brokePath.reset() + brokePath.moveTo(startX, startY) + brokePath.lineTo(endX, endY) + endX += BROKE_LINE_LENGTH + brokePath.lineTo(endX, endY) + canvas.drawPath(brokePath, brokePaint) + + // 绘制右上角 + startX = halfTargetWidth - BROKE_LINE_LENGTH + startY = 0f + + endX = halfTargetWidth + endY = 0f + brokePath.reset() + brokePath.moveTo(startX, startY) + brokePath.lineTo(endX, endY) + endY += BROKE_LINE_LENGTH + brokePath.lineTo(endX, endY) + canvas.drawPath(brokePath, brokePaint) + + //绘制左下角 + startX = -halfTargetWidth + startY = newTargetHeight - BROKE_LINE_LENGTH + endX = startX + endY = newTargetHeight + brokePath.reset() + brokePath.moveTo(startX, startY) + brokePath.lineTo(endX, endY) + endX += BROKE_LINE_LENGTH + brokePath.lineTo(endX, endY) + canvas.drawPath(brokePath, brokePaint) + + //绘制右下角 + startX = halfTargetWidth - BROKE_LINE_LENGTH + startY = newTargetHeight + endX = halfTargetWidth + endY = startY + brokePath.reset() + brokePath.moveTo(startX, startY) + brokePath.lineTo(endX, endY) + endY -= BROKE_LINE_LENGTH + brokePath.lineTo(endX, endY) + canvas.drawPath(brokePath, brokePaint) + } finally { + canvas.restore() } } finally { - if (isTimedBlock) { - try { - Thread.sleep(2000) - } catch (ignore: Exception) { } + try { + if (canvas != null && holder.surface.isValid) { + holder.unlockCanvasAndPost(canvas) + } + isSurfaceValid = holder.surface.isValid + } catch (t: Throwable) { + t.printStackTrace() } - handler.get().post(this) } } @@ -304,6 +287,8 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas Log.d(TAG, "-- onEach ---:$it") if (it.isValid()) { data = it + handler.get()?.removeCallbacks(this@M1LookAroundView) + handler.get()?.post(this@M1LookAroundView) } }.collect() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index f5c87af79d..388499ef71 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -96,6 +96,9 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( } else if(category == MsgCategory.SYS_INFO){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) //todo 过滤MAP系统异常报警 + } else if(category == MsgCategory.FM_INFO){ + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + showData(msgBoxBean) } else{ if(msgBoxBean.sourceType == DataSourceType.SUMMARY){ //在一次订单中汇总消息只展示一次 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt index bdbb2573f6..2106591153 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt @@ -45,9 +45,10 @@ class DriverMsgBoxListView @JvmOverloads constructor( initView() } private val TAG = "DriverMsgBoxListView" - private var noticeList: ArrayList ?= null - private var ipcReportList: ArrayList ?= null - private var badCaseList: ArrayList ?= null + private var noticeList: ArrayList ?= null //通知消息列表 + private var fmList: ArrayList ?= null //FM信息消息列表 + private var ipcReportList: ArrayList ?= null //车辆系统信息消息列表 + private var badCaseList: ArrayList ?= null//录包消息列表 private var driverMsgBoxListAdapter: DriverMsgBoxListAdapter ?=null private var linearLayoutManager: LinearLayoutManager ?= null @@ -71,9 +72,11 @@ class DriverMsgBoxListView @JvmOverloads constructor( //通知 tvMsgNotice.setOnClickListener { tvMsgNotice.setTextColor(resources.getColor(R.color.msg_box_title_color)) + tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF)) viewNoticeDivider.visibility = View.VISIBLE + viewFmDivider.visibility = View.GONE viewIpcReportDivider.visibility = View.GONE viewBadCaseDivider.visibility = View.GONE MsgBoxConfig.setUserRecord(0) @@ -86,15 +89,36 @@ class DriverMsgBoxListView @JvmOverloads constructor( } } + //FM信息 + tvMsgFm.setOnClickListener { + tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgFm.setTextColor(resources.getColor(R.color.msg_box_title_color)) + tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF)) + viewNoticeDivider.visibility = View.GONE + viewFmDivider.visibility = View.VISIBLE + viewIpcReportDivider.visibility = View.GONE + viewBadCaseDivider.visibility = View.GONE + MsgBoxConfig.setUserRecord(1) + if(fmList == null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter?.setData(fmList!!) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } + } //车辆系统信息 tvMsgIpcReport.setOnClickListener { tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgIpcReport.setTextColor(resources.getColor(R.color.msg_box_title_color)) tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF)) viewNoticeDivider.visibility = View.GONE + viewFmDivider.visibility = View.GONE viewIpcReportDivider.visibility = View.VISIBLE viewBadCaseDivider.visibility = View.GONE - MsgBoxConfig.setUserRecord(1) + MsgBoxConfig.setUserRecord(2) if(ipcReportList == null){ rvMsgBoxList.visibility = View.GONE }else{ @@ -107,12 +131,14 @@ class DriverMsgBoxListView @JvmOverloads constructor( //录包 tvMsgBadCase.setOnClickListener { tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgBadCase.setTextColor(resources.getColor(R.color.msg_box_title_color)) viewNoticeDivider.visibility = View.GONE + viewFmDivider.visibility = View.GONE viewIpcReportDivider.visibility = View.GONE viewBadCaseDivider.visibility = View.VISIBLE - MsgBoxConfig.setUserRecord(2) + MsgBoxConfig.setUserRecord(3) if(badCaseList == null){ rvMsgBoxList.visibility = View.GONE }else{ @@ -127,11 +153,14 @@ class DriverMsgBoxListView @JvmOverloads constructor( fun notifyData(){ //获取当前Tab选择 when(MsgBoxConfig.getUserRecord()){ + //通知消息 0 ->{ tvMsgNotice.setTextColor(resources.getColor(R.color.msg_box_title_color)) + tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF)) viewNoticeDivider.visibility = View.VISIBLE + viewFmDivider.visibility = View.GONE viewIpcReportDivider.visibility = View.GONE viewBadCaseDivider.visibility = View.GONE if(noticeList==null){ @@ -142,11 +171,32 @@ class DriverMsgBoxListView @JvmOverloads constructor( rvMsgBoxList.scrollToPosition(0) } } - 1 ->{ + //FM消息 + 1->{ tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgFm.setTextColor(resources.getColor(R.color.msg_box_title_color)) + tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF)) + viewNoticeDivider.visibility = View.GONE + viewFmDivider.visibility = View.VISIBLE + viewIpcReportDivider.visibility = View.GONE + viewBadCaseDivider.visibility = View.GONE + if(fmList == null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter?.setData(fmList!!) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } + } + //车辆系统信息消息 + 2 ->{ + tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgIpcReport.setTextColor(resources.getColor(R.color.msg_box_title_color)) tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF)) viewNoticeDivider.visibility = View.GONE + viewFmDivider.visibility = View.GONE viewIpcReportDivider.visibility = View.VISIBLE viewBadCaseDivider.visibility = View.GONE if(ipcReportList == null){ @@ -157,11 +207,14 @@ class DriverMsgBoxListView @JvmOverloads constructor( rvMsgBoxList.scrollToPosition(0) } } - 2 ->{ + //录包消息 + 3 ->{ tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF)) tvMsgBadCase.setTextColor(resources.getColor(R.color.msg_box_title_color)) viewNoticeDivider.visibility = View.GONE + viewFmDivider.visibility = View.GONE viewIpcReportDivider.visibility = View.GONE viewBadCaseDivider.visibility = View.VISIBLE if(badCaseList == null){ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt index 5cbc439866..5f0323fd51 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt @@ -11,6 +11,8 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.msgbox.VoiceMsg +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener import com.mogo.eagle.core.function.api.order.IOrderListener import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager @@ -31,13 +33,17 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IOrderListener { +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IOrderListener, + IMsgBoxEventListener { private val TAG = "PassengerMsgBoxBubbleView" private val dataList :ArrayList = ArrayList() private var passengerMsgBoxBubbleAdapter: PassengerMsgBoxBubbleAdapter ?= null private var isShowData = true private var isShowSummary = false //是否展示汇总消息 + private var isCacheMsg = false //是否缓存消息 + private var voiceIsShowing = false //小智语音消息是否正在展示 + private var voiceMsgBean: MsgBoxCountDownBean ?= null //小智语音消息封装 init { LayoutInflater.from(context).inflate(R.layout.layout_passenger_msg_box_bubble, this, true) @@ -65,20 +71,95 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( if(category == MsgCategory.NOTICE){ if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X || msgBoxList.type == MsgBoxType.OBU){ - if(msgBoxList.sourceType == DataSourceType.SUMMARY){ - //在一次订单中汇总消息只展示一次 - if(isShowSummary){ - operationalData(msgBoxList) - isShowSummary = false - } + if(isCacheMsg){ + //将消息缓存到未播放列表等待小智语音播放完成后取出播放 + MsgBoxConfig.unPlayList.add(msgBoxList) }else{ - operationalData(msgBoxList) + //实时播放消息 + notifyMsg(msgBoxList) } } } + if(category == MsgCategory.VOICE_INFO){ + if(msgBoxList.type == MsgBoxType.VOICE){ + executeVoiceInfo(msgBoxList) + } + } },UiThreadHandler.MODE.QUEUE) } + /** + * 小智语音消息执行 + */ + private fun executeVoiceInfo(msgBoxList: MsgBoxBean){ + val voiceMsg = msgBoxList.bean as VoiceMsg + if(voiceMsg.isWakeUp && !voiceMsg.isWakeUpEnd){ + //有其他消息时,将其他消息缓存进未播放列表 + voiceIsShowing = true + isCacheMsg = true + //开始展示消息 + if(voiceMsgBean == null){ + voiceMsgBean = MsgBoxCountDownBean(msgBoxList) + dataList.add(voiceMsgBean!!) + }else{ + dataList.remove(voiceMsgBean) + voiceMsgBean!!.msgBoxBean = msgBoxList + dataList.add(voiceMsgBean!!) + } + passengerMsgBoxBubbleAdapter?.setData(dataList) + } + if(!voiceMsg.isWakeUp && voiceMsg.isWakeUpEnd){ + //关闭消息展示 + dataList.remove(voiceMsgBean) + passengerMsgBoxBubbleAdapter?.setData(dataList) + //如果未播放列表中有未播放的消息则陆续展示消息,新来的消息继续放到未播放列表中, + //如果未播放消息列表为空,则立刻改变状态,即使播放新消息 + voiceIsShowing = false + handleCachedMsg() + } + + } + + /** + * 播放缓存消息 + */ + private fun handleCachedMsg(){ + if(MsgBoxConfig.unPlayList.isEmpty()){ + isCacheMsg = false + }else{ + //开始播放缓存未播放消息 + val iterator = MsgBoxConfig.unPlayList.iterator() + while(iterator.hasNext()){ + val msg = iterator.next() + if(passengerMsgBoxBubbleAdapter!!.getDataSize()<3){ + notifyMsg(msg) + iterator.remove() + } + } + if(MsgBoxConfig.unPlayList.isEmpty()){ + isCacheMsg = false + } + } + } + + /** + * 通知新消息展示 + */ + private fun notifyMsg(msgBoxList: MsgBoxBean){ + if(msgBoxList.sourceType == DataSourceType.SUMMARY){ + //在一次订单中汇总消息只展示一次 + if(isShowSummary){ + operationalData(msgBoxList) + isShowSummary = false + } + }else{ + operationalData(msgBoxList) + } + } + + /** + * 处理播放消息 + */ private fun operationalData(msgBoxList: MsgBoxBean){ MsgBoxConfig.noticeList.add(msgBoxList) if(isShowData){ @@ -93,16 +174,28 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( super.onAttachedToWindow() CallerMsgBoxListenerManager.addListener(TAG,this) CallerOrderListenerManager.addListener(TAG,this) + CallerMsgBoxEventListenerManager.addListener(TAG,this) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() CallerMsgBoxListenerManager.removeListener(TAG) CallerOrderListenerManager.removeListener(TAG) + CallerMsgBoxEventListenerManager.removeListener(TAG) } override fun onUpdateOrderStatus(inOrder: Boolean) { isShowSummary = inOrder } + /** + * 播放缓存消息 + */ + override fun onHandleCachedMsg() { + if(voiceIsShowing){ + return + } + handleCachedMsg() + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/SharpView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/SharpView.java index af4567c9dd..8261e641a1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/SharpView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/SharpView.java @@ -12,19 +12,18 @@ import androidx.annotation.Nullable; public class SharpView extends View { - private int mWidth =0; //三角形的宽度 - private int mHeight =0; //三角形的高度 - private Context mContext; + private int mWidth = 0; //三角形的宽度 + private int mHeight = 0; //三角形的高度 + private final Paint paint = new Paint(); + private final Path path = new Path(); public SharpView(Context context) { super(context); - this.mContext=context; initView(); } public SharpView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); - this.mContext=context; initView(); } @@ -32,28 +31,27 @@ public class SharpView extends View { mWidth = 25; mHeight = 25; } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - setMeasuredDimension(mWidth,mHeight); + setMeasuredDimension(mWidth, mHeight); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //创建画笔 - Paint paint = new Paint(); paint.setColor(Color.parseColor("#FFFFFFFF")); paint.setAntiAlias(true); //抗锯齿 paint.setStyle(Paint.Style.FILL);//实线 //创建路径 - Path path = new Path(); - path.moveTo(0,mHeight); - path.lineTo(mWidth,mHeight); - path.lineTo(mWidth/2,0); + path.moveTo(0, mHeight); + path.lineTo(mWidth, mHeight); + path.lineTo(mWidth / 2.0f, 0); path.close();//闭合路径 //画在画布上 - canvas.drawPath(path,paint); + canvas.drawPath(path, paint); } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt index bb9245f5ca..0a3f3c3b84 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt @@ -42,6 +42,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A private val v2x: Int = 3 private val report: Int = 4 private val summary: Int = 5 + private val fm: Int = 6 private var changeViewListener: ChangeViewListener?=null @@ -86,6 +87,10 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_summary,parent,false) return BubbleSummaryHolder(view) } + fm -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_fm,parent,false) + return BubbleFmHolder(view) + } else -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_v2x,parent,false) return BubbleV2XHolder(view) @@ -213,6 +218,12 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A holder.tvSummaryContent.text = summaryMsg.content } } + is BubbleFmHolder ->{ + data?.let { + val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg + + } + } } val msgBoxBean: MsgBoxCountDownBean = data!![position] @@ -260,6 +271,8 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A notice }else if(data!![position].msgBoxBean.type == MsgBoxType.V2X && data!![position].msgBoxBean.sourceType == DataSourceType.SUMMARY){ summary + }else if(data!![position].msgBoxBean.type == MsgBoxType.FMINFO){ + fm } else{ v2x } @@ -320,6 +333,11 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A var tvSummaryTime: TextView = itemView.findViewById(R.id.tvSummaryTime) } + //FM消息 + class BubbleFmHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + + } + fun setChangeListener(listener: ChangeViewListener){ changeViewListener = listener } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt index d015352286..3154d33766 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt @@ -41,8 +41,9 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : private val operationDoorSwitchFail: Int = 13 private val notice: Int = 2 private val v2x: Int = 3 - private val report: Int = 5 - private val record: Int = 6 + private val fm: Int = 4 //FM信息 + private val report: Int = 5 //系统信息 + private val record: Int = 6 //录包 private val summary: Int = 8 //Error @@ -61,16 +62,24 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { when (viewType) { + //录包 record -> { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_bad_case, parent, false) return BadCaseHolder(view) } + //系统信息 report -> { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_msg_box_ipc_report, parent, false) return MsgBoxIpcReportHolder(view) } + //FM信息 + fm -> { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_msg_box_fm,parent,false) + return FmInfoHolder(view) + } operation -> { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_msg_box_operation, parent, false) @@ -112,6 +121,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { + //录包 is BadCaseHolder -> { data?.let { holder.tvBagReceiveTime.text = @@ -125,6 +135,13 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : } } } + //FM信息 + is FmInfoHolder -> { + data?.let { + + } + } + //系统信息 is MsgBoxIpcReportHolder -> { data?.let { it -> val reportMsgBox = it[position] @@ -434,7 +451,10 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : report } else if (data!![position].type == MsgBoxType.RECORD) { record - } else { + } else if(data!![position].type == MsgBoxType.FMINFO){ + fm + } + else { v2x } } @@ -446,6 +466,11 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : var tvRecordCheck: TextView = itemView.findViewById(R.id.tvRecordCheck) } + //FM信息 + class FmInfoHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + + } + //车辆系统信息 class MsgBoxIpcReportHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var ivReportImageNormal: ImageView = itemView.findViewById(R.id.ivReportImageNormal) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt index 7cf0289ddf..f2cd1a7db6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt @@ -1,7 +1,9 @@ package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter import android.app.Activity +import android.content.res.Resources import android.os.CountDownTimer +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -17,6 +19,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat @@ -34,6 +37,7 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView private val notice: Int = 1 private val v2x: Int = 2 private val summary: Int = 3 + private val voice: Int = 4 fun setData(data: ArrayList){ this.data = data @@ -43,6 +47,17 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView notifyDataSetChanged() } + /** + * 获取列表数据个数 + */ + fun getDataSize(): Int{ + return if(data.isNullOrEmpty()){ + 0 + }else{ + data!!.size + } + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { notice -> { @@ -53,6 +68,11 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_summary,parent,false) BubbleSummaryHolder(view) } + //小智语音 + voice -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_voice,parent,false) + BubbleVoiceHolder(view) + } else -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_v2x,parent,false) BubbleV2XHolder(view) @@ -108,23 +128,41 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView } } } + //小智语音消息 + is BubbleVoiceHolder -> { + data?.let { + val voiceMsg = it[position].msgBoxBean.bean as VoiceMsg + holder.tvPassengerVoiceContent.text = voiceMsg.msg + if(voiceMsg.isResp){ + //小智说的 + holder.tvPassengerVoiceContent.setTextColor(activity.resources.getColor(R.color.black)) + }else{ + //用户说的 + holder.tvPassengerVoiceContent.setTextColor(activity.resources.getColor(R.color.blue)) + } + } + } } val msgBoxBean: MsgBoxCountDownBean = data!![position] - msgBoxBean.countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),1000){ - override fun onTick(p0: Long) { + if(msgBoxBean.msgBoxBean.type != MsgBoxType.VOICE){ + msgBoxBean.countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),CallerMsgBoxManager.getDismissTime()){ + override fun onTick(p0: Long) { - } + } - override fun onFinish() { - data?.remove(msgBoxBean) - notifyDataSetChanged() + override fun onFinish() { + data?.remove(msgBoxBean) + notifyDataSetChanged() // notifyItemRemoved(index) // notifyItemRangeChanged(index,recordTypeEntity.size-index) - } + //通知消息盒子可以展示新的缓存消息 + CallerMsgBoxEventListenerManager.invokeHandleCachedMsg() + } + } + msgBoxBean.countDownTimer?.start() } - msgBoxBean.countDownTimer?.start() } override fun getItemCount() = data?.size ?: 0 @@ -134,7 +172,9 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView notice }else if(data!![position].msgBoxBean.type == MsgBoxType.V2X && data!![position].msgBoxBean.sourceType == DataSourceType.SUMMARY){ summary - } else{ + }else if(data!![position].msgBoxBean.type == MsgBoxType.VOICE){ + voice + }else{ v2x } } @@ -160,4 +200,9 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView var tvPassengerSummaryTime: TextView = itemView.findViewById(R.id.tvPassengerSummaryTime) } + //小智语音消息 + class BubbleVoiceHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvPassengerVoiceContent: TextView = itemView.findViewById(R.id.tvPassengerVoiceContent) + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/DispatchDialogManager.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/DispatchDialogManager.java index 457a1682e9..28da7fc5d0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/DispatchDialogManager.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/DispatchDialogManager.java @@ -5,6 +5,7 @@ import static com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocRece import static com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBean.DISPATCH_TYPE_START; import static com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBean.DISPATCH_TYPE_STOP; +import android.annotation.SuppressLint; import android.content.Context; import com.mogo.commons.voice.AIAssist; @@ -12,6 +13,7 @@ import com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBea public class DispatchDialogManager { + @SuppressLint("StaticFieldLeak") private static volatile DispatchDialogManager manager; private static final byte[] obj = new byte[0]; private final Context mContext; 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 c3f19c6a35..798e21331a 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 @@ -1311,11 +1311,9 @@ internal class DebugSettingView @JvmOverloads constructor( */ tbSelfLog.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { - LogUtils.getConfig().isLogSwitch = false Logger.init(LogLevel.OFF) MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = false } else { - LogUtils.getConfig().isLogSwitch = true Logger.init(LogLevel.DEBUG) MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = true } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt index e08857ad0c..b713f0c36d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt @@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.hmi.ui.setting import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.Toast @@ -14,21 +13,23 @@ import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.function.api.autopilot.IMoGoGetParamResponseListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener -import com.mogo.eagle.core.function.api.devatools.mofang.* +import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN import com.mogo.eagle.core.function.api.setting.ISopSettingListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotGetParamResponseDispatcher -import com.mogo.eagle.core.function.call.devatools.* +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager -import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager +import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager +import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils @@ -64,7 +65,7 @@ internal class SOPSettingView @JvmOverloads constructor( } private fun initView() { - sopLayout.setOnClickListener { } + sopLayout.setOnClickListener { } //V2X消息设置 v2xSetting() //地图效果类设置 @@ -78,50 +79,41 @@ internal class SOPSettingView @JvmOverloads constructor( /** * V2X消息设置 */ - private fun v2xSetting(){ + private fun v2xSetting() { //V2X总开关 scV2XSwitch.isChecked = FunctionBuildConfig.v2xMainSwitch scV2XSwitch.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.v2xMainSwitch = isChecked - hmiAction("SOP V2X总开关, ",isChecked) - Log.i(TAG,"SOP V2X总开关,$isChecked") - if(isChecked){ + hmiAction("SOP V2X总开关, ", isChecked) + if (isChecked) { //V2N总开关 scV2NSwitch.isChecked = FunctionBuildConfig.v2nMainSwitch - hmiAction("SOP V2N总开关, ",FunctionBuildConfig.v2nMainSwitch) - Log.i(TAG,"SOP V2N总开关, ${FunctionBuildConfig.v2nMainSwitch}") + hmiAction("SOP V2N总开关, ", FunctionBuildConfig.v2nMainSwitch) //V2I总开关 scV2ISwitch.isChecked = HmiBuildConfig.isShowObuV2iView - hmiAction("SOP V2I总开关, ",HmiBuildConfig.isShowObuV2iView) - Log.i(TAG,"SOP V2I总开关, ${HmiBuildConfig.isShowObuV2iView}") + hmiAction("SOP V2I总开关, ", HmiBuildConfig.isShowObuV2iView) //V2V总开关 scObuV2vView.isChecked = HmiBuildConfig.isShowObuV2vView - hmiAction("SOP V2V总开关, ",HmiBuildConfig.isShowObuV2vView) - Log.i(TAG,"SOP V2V总开关, ${HmiBuildConfig.isShowObuV2vView}") + hmiAction("SOP V2V总开关, ", HmiBuildConfig.isShowObuV2vView) //obu总开关 scObu.isChecked = obuConnectStatus - hmiAction("SOP obu总开关, ",obuConnectStatus) - Log.i(TAG,"SOP obu总开关, $obuConnectStatus") - if(obuConnectStatus){ + hmiAction("SOP obu总开关, ", obuConnectStatus) + if (obuConnectStatus) { CallerObuApiManager.resetObuIpAddress(MogoObuConst.OBU_DEFAULT_IP) } - }else{ + } else { //V2N总开关 scV2NSwitch.isChecked = false - hmiAction("SOP V2N总开关, ",false) - Log.i(TAG,"SOP V2N总开关, false") + hmiAction("SOP V2N总开关, ", false) //V2I总开关 scV2ISwitch.isChecked = false - hmiAction("SOP V2I总开关, ",false) - Log.i(TAG,"SOP V2I总开关, false") + hmiAction("SOP V2I总开关, ", false) //V2V总开关 scObuV2vView.isChecked = false - hmiAction("SOP V2V总开关, ",false) - Log.i(TAG,"SOP V2V总开关, false") + hmiAction("SOP V2V总开关, ", false) //obu总开关 scObu.isChecked = false - hmiAction("SOP OBU控制总开关, ",false) - Log.i(TAG,"SOP OBU控制总开关, false") + hmiAction("SOP OBU控制总开关, ", false) //断开链接 CallerObuApiManager.disConnectObu() } @@ -141,41 +133,41 @@ internal class SOPSettingView @JvmOverloads constructor( //绿波通行(默认关闭) scGreenWaveSop.isEnabled = FunctionBuildConfig.v2nMainSwitch scV2NSwitch.setOnCheckedChangeListener { compoundButton, isChecked -> - if(isChecked){ + if (isChecked) { //V2N新链路 scNewV2NData.isChecked = FunctionBuildConfig.isNewV2NData - hmiAction("SOP 是否是V2N新链路(云->工控机->App)",FunctionBuildConfig.isNewV2NData) - Log.i(TAG,"SOP 是否是V2N新链路(云->工控机->App), ${FunctionBuildConfig.isNewV2NData}") + hmiAction("SOP 是否是V2N新链路(云->工控机->App)", FunctionBuildConfig.isNewV2NData) //V2N场景进PNC scV2nPnc.isChecked = FunctionBuildConfig.isV2NPnc - hmiAction("SOP V2N场景进PNC, ",FunctionBuildConfig.isV2NPnc) - Log.i(TAG,"SOP V2N场景进PNC, ${FunctionBuildConfig.isV2NPnc}") + hmiAction("SOP V2N场景进PNC, ", FunctionBuildConfig.isV2NPnc) CallerAutoPilotControlManager.sendV2nToPncCmd(FunctionBuildConfig.isV2NPnc) //绿波通行 scGreenWaveSop.isChecked = HmiBuildConfig.isShowGreenWaveView - hmiAction("SOP obu绿波通行, ",HmiBuildConfig.isShowGreenWaveView) - Log.i(TAG,"SOP obu绿波通行, ${HmiBuildConfig.isShowGreenWaveView}") - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "1".toByteArray()) - }else{ + hmiAction("SOP obu绿波通行, ", HmiBuildConfig.isShowGreenWaveView) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.OBU_GREENWAVE_WARNING, + "1".toByteArray() + ) + } else { //V2N新链路 scNewV2NData.isChecked = false - hmiAction("SOP 是否是V2N新链路(云->工控机->App)",false) - Log.i(TAG,"SOP 是否是V2N新链路(云->工控机->App), false") + hmiAction("SOP 是否是V2N新链路(云->工控机->App)", false) //V2N场景进PNC scV2nPnc.isChecked = false - hmiAction("SOP V2N场景进PNC, ",false) - Log.i(TAG,"SOP V2N场景进PNC, false") + hmiAction("SOP V2N场景进PNC, ", false) CallerAutoPilotControlManager.sendV2nToPncCmd(false) //绿波通行 scGreenWaveSop.isChecked = false - hmiAction("SOP obu绿波通行, ",false) - Log.i(TAG,"SOP obu绿波通行, false") - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "0".toByteArray()) + hmiAction("SOP obu绿波通行, ", false) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.OBU_GREENWAVE_WARNING, + "0".toByteArray() + ) } scNewV2NData.isEnabled = isChecked scV2nPnc.isEnabled = isChecked scGreenWaveSop.isEnabled = isChecked - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } FunctionBuildConfig.v2nMainSwitch = isChecked @@ -188,41 +180,41 @@ internal class SOPSettingView @JvmOverloads constructor( scRunRedLightSop.isEnabled = HmiBuildConfig.isShowObuV2iView scObuWeaknessTrafficSop.isEnabled = HmiBuildConfig.isShowObuV2iView scV2ISwitch.setOnCheckedChangeListener { compoundButton, isChecked -> - if(isChecked){ + if (isChecked) { //V2I场景进PNC scV2iPnc.isChecked = FunctionBuildConfig.isV2IPnc - hmiAction("SOP V2I场景进PNC, ",FunctionBuildConfig.isV2IPnc) - Log.i(TAG,"SOP V2I场景进PNC,${FunctionBuildConfig.isV2IPnc}") + hmiAction("SOP V2I场景进PNC, ", FunctionBuildConfig.isV2IPnc) CallerAutoPilotControlManager.sendV2iToPncCmd(FunctionBuildConfig.isV2IPnc) //闯红灯预警 scRunRedLightSop.isChecked = HmiBuildConfig.isShowRunRedLightView - hmiAction("SOP obu闯红灯预警, ",HmiBuildConfig.isShowRunRedLightView) - Log.i(TAG,"SOP obu闯红灯预警, ${HmiBuildConfig.isShowRunRedLightView}") - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "1".toByteArray()) + hmiAction("SOP obu闯红灯预警, ", HmiBuildConfig.isShowRunRedLightView) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.OBU_RUNREDLIGHT_WARNING, + "1".toByteArray() + ) //路侧弱势交通参与者 scObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView - hmiAction("SOP obu弱势交通控制, ",HmiBuildConfig.isShowObuWeaknessTrafficView) - Log.i(TAG,"SOP obu弱势交通控制, ${HmiBuildConfig.isShowObuWeaknessTrafficView}") - }else{ + hmiAction("SOP obu弱势交通控制, ", HmiBuildConfig.isShowObuWeaknessTrafficView) + } else { //V2I场景进PNC scV2iPnc.isChecked = false CallerAutoPilotControlManager.sendV2iToPncCmd(false) - hmiAction("SOP V2I场景进PNC, ",false) - Log.i(TAG,"SOP V2I场景进PNC, false") + hmiAction("SOP V2I场景进PNC, ", false) //闯红灯预警 scRunRedLightSop.isChecked = false - hmiAction("SOP obu闯红灯预警, ",false) - Log.i(TAG,"SOP obu闯红灯预警, false") - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "0".toByteArray()) + hmiAction("SOP obu闯红灯预警, ", false) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.OBU_RUNREDLIGHT_WARNING, + "0".toByteArray() + ) //路侧弱势交通参与者 scObuWeaknessTrafficSop.isChecked = false - hmiAction("SOP obu弱势交通控制, ",false) - Log.i(TAG,"SOP obu弱势交通控制, false") + hmiAction("SOP obu弱势交通控制, ", false) } scV2iPnc.isEnabled = isChecked scRunRedLightSop.isEnabled = isChecked scObuWeaknessTrafficSop.isEnabled = isChecked - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } HmiBuildConfig.isShowObuV2iView = isChecked @@ -231,22 +223,20 @@ internal class SOPSettingView @JvmOverloads constructor( //V2N新链路 scNewV2NData.isChecked = FunctionBuildConfig.isNewV2NData scNewV2NData.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP 是否是V2N新链路(云->工控机->App)",isChecked) - Log.i(TAG,"SOP 是否是V2N新链路(云->工控机->App) ${isChecked}") + hmiAction("SOP 是否是V2N新链路(云->工控机->App)", isChecked) FunctionBuildConfig.isNewV2NData = isChecked } //V2N场景进PNC scV2nPnc.isChecked = FunctionBuildConfig.isV2NPnc - scV2nPnc.setOnCheckedChangeListener{ compoundButton, isChecked -> - if(!compoundButton.isPressed){ + scV2nPnc.setOnCheckedChangeListener { compoundButton, isChecked -> + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP V2N场景进PNC, ",isChecked) - Log.i(TAG,"SOP V2N场景进PNC, $isChecked") + hmiAction("SOP V2N场景进PNC, ", isChecked) CallerAutoPilotControlManager.sendV2nToPncCmd(isChecked) FunctionBuildConfig.isV2NPnc = isChecked } @@ -254,27 +244,31 @@ internal class SOPSettingView @JvmOverloads constructor( //绿波通行(默认关闭) scGreenWaveSop.isChecked = HmiBuildConfig.isShowGreenWaveView scGreenWaveSop.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP obu绿波通行, ",isChecked) - Log.i(TAG,"SOP obu绿波通行, $isChecked") + hmiAction("SOP obu绿波通行, ", isChecked) HmiBuildConfig.isShowGreenWaveView = isChecked if (HmiBuildConfig.isShowGreenWaveView) { - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "1".toByteArray()) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.OBU_GREENWAVE_WARNING, + "1".toByteArray() + ) } else { - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "0".toByteArray()) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.OBU_GREENWAVE_WARNING, + "0".toByteArray() + ) } } //V2I场景进PNC scV2iPnc.isChecked = FunctionBuildConfig.isV2IPnc - scV2iPnc.setOnCheckedChangeListener{ compoundButton, isChecked -> - if(!compoundButton.isPressed){ + scV2iPnc.setOnCheckedChangeListener { compoundButton, isChecked -> + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP V2I场景进PNC, ",isChecked) - Log.i(TAG,"SOP V2I场景进PNC, $isChecked") + hmiAction("SOP V2I场景进PNC, ", isChecked) CallerAutoPilotControlManager.sendV2iToPncCmd(isChecked) FunctionBuildConfig.isV2IPnc = isChecked } @@ -282,38 +276,41 @@ internal class SOPSettingView @JvmOverloads constructor( //闯红灯预警(默认关闭) scRunRedLightSop.isChecked = HmiBuildConfig.isShowRunRedLightView scRunRedLightSop.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP obu闯红灯预警, ",isChecked) - Log.i(TAG,"SOP obu闯红灯预警, $isChecked") + hmiAction("SOP obu闯红灯预警, ", isChecked) HmiBuildConfig.isShowRunRedLightView = isChecked if (HmiBuildConfig.isShowRunRedLightView) { - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "1".toByteArray()) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.OBU_RUNREDLIGHT_WARNING, + "1".toByteArray() + ) } else { - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "0".toByteArray()) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.OBU_RUNREDLIGHT_WARNING, + "0".toByteArray() + ) } } //路侧弱势交通参与者(默认开启) scObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView scObuWeaknessTrafficSop.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP obu弱势交通控制, ",isChecked) - Log.i(TAG,"SOP obu弱势交通控制, $isChecked") + hmiAction("SOP obu弱势交通控制, ", isChecked) HmiBuildConfig.isShowObuWeaknessTrafficView = isChecked } //V2V总开关(默认关闭) scObuV2vView.isChecked = HmiBuildConfig.isShowObuV2vView scObuV2vView.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP obuV2V开关, ",isChecked) - Log.i(TAG,"SOP obuV2V开关, $isChecked") + hmiAction("SOP obuV2V开关, ", isChecked) HmiBuildConfig.isShowObuV2vView = isChecked } @@ -321,11 +318,10 @@ internal class SOPSettingView @JvmOverloads constructor( obuConnectStatus = CallerObuApiManager.isConnected() scObu.isChecked = obuConnectStatus scObu.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP OBU控制总开关, ",isChecked) - Log.i(TAG,"SOP OBU控制总开关, $isChecked") + hmiAction("SOP OBU控制总开关, ", isChecked) if (isChecked) { CallerObuApiManager.resetObuIpAddress(MogoObuConst.OBU_DEFAULT_IP) } else { @@ -339,12 +335,11 @@ internal class SOPSettingView @JvmOverloads constructor( /** * 地图效果类设置 */ - private fun mapSetting(){ + private fun mapSetting() { //危险障碍物颜色标记开关 scMarkingObstacles.isChecked = FunctionBuildConfig.isPNCWarning scMarkingObstacles.setOnCheckedChangeListener { _, isChecked -> - hmiAction("SOP 危险障碍物颜色标记开关, ",isChecked) - Log.i(TAG,"SOP 危险障碍物颜色标记开关, $isChecked") + hmiAction("SOP 危险障碍物颜色标记开关, ", isChecked) FunctionBuildConfig.isPNCWarning = isChecked } if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { @@ -354,8 +349,7 @@ internal class SOPSettingView @JvmOverloads constructor( //引导线动态效果 scRouteDynamicEffect.isChecked = HmiBuildConfig.isShowRouteStrategy scRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked -> - hmiAction("SOP 引导线动态效果, ",isChecked) - Log.i(TAG,"SOP 引导线动态效果, $isChecked") + hmiAction("SOP 引导线动态效果, ", isChecked) HmiBuildConfig.isShowRouteStrategy = isChecked } @@ -364,40 +358,37 @@ internal class SOPSettingView @JvmOverloads constructor( scDrawPointCloudData.isChecked = FunctionBuildConfig.isDrawPointCloudData //是否渲染点云数据 scDrawPointCloudData.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } //打开点云效果时,如果自车光圈是关闭状态,则自动打开自车光圈(点云是跟随光圈的 默认没有光圈就不显示点云的) - if(isChecked && !FunctionBuildConfig.isDisplayAnimEnable){ + if (isChecked && !FunctionBuildConfig.isDisplayAnimEnable) { scCarAperture.isChecked = true - }else{ + } else { scCarAperture.isChecked = FunctionBuildConfig.isDisplayAnimEnable } CallerAutoPilotControlManager.setIsDrawPointCloud(isChecked) FunctionBuildConfig.isDrawPointCloudData = isChecked CallerMapUIServiceManager.getMapUIController()?.setIsDrawPointCloud(isChecked) CallerSopSettingManager.invokePointCloudListener(isChecked) - hmiAction("SOP 是否渲染点云数据, ",isChecked) - Log.i(TAG,"SOP 是否渲染点云数据, $isChecked") + hmiAction("SOP 是否渲染点云数据, ", isChecked) } //自车光圈 - if(FunctionBuildConfig.isDrawPointCloudData){ + if (FunctionBuildConfig.isDrawPointCloudData) { //如果点云效果是打开的,则自车光圈也跟随打开 FunctionBuildConfig.isDisplayAnimEnable = true scCarAperture.isChecked = true CallerMapUIServiceManager.getMapUIController()?.setDisplayAnimEnable(true) - hmiAction("SOP 是否展示自车光圈,",FunctionBuildConfig.isDisplayAnimEnable) - Log.i(TAG,"SOP 是否展示自车光圈,${FunctionBuildConfig.isDisplayAnimEnable}") - }else{ + hmiAction("SOP 是否展示自车光圈,", FunctionBuildConfig.isDisplayAnimEnable) + } else { scCarAperture.isChecked = FunctionBuildConfig.isDisplayAnimEnable } scCarAperture.setOnCheckedChangeListener { compoundButton, isChecked -> CallerMapUIServiceManager.getMapUIController()?.setDisplayAnimEnable(isChecked) CallerSopSettingManager.invokeCarApertureListener(isChecked) - hmiAction("SOP 是否展示自车光圈,",isChecked) - Log.i(TAG,"SOP 是否展示自车光圈,$isChecked") - if(!compoundButton.isPressed){ + hmiAction("SOP 是否展示自车光圈,", isChecked) + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } FunctionBuildConfig.isDisplayAnimEnable = isChecked @@ -407,12 +398,11 @@ internal class SOPSettingView @JvmOverloads constructor( /** * 与车相关类设置 */ - private fun vehicleSetting(){ + private fun vehicleSetting() { //绕障类功能 scObstacleAvoidance.isChecked = FunctionBuildConfig.isDetouring scObstacleAvoidance.setOnCheckedChangeListener { _, isChecked -> - hmiAction("SOP 绕障类功能开关, ",isChecked) - Log.i(TAG,"SOP 绕障类功能开关, $isChecked") + hmiAction("SOP 绕障类功能开关, ", isChecked) CallerAutoPilotControlManager.sendDetouring(isChecked) FunctionBuildConfig.isDetouring = isChecked } @@ -420,14 +410,16 @@ internal class SOPSettingView @JvmOverloads constructor( // 演示模式,上一次勾选的数据 scDemoMode.isChecked = FunctionBuildConfig.isDemoMode scDemoMode.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP 演示模式开关, ",!FunctionBuildConfig.isDemoMode) - Log.i(TAG,"SOP 演示模式开关, ${!FunctionBuildConfig.isDemoMode}") + hmiAction("SOP 演示模式开关, ", !FunctionBuildConfig.isDemoMode) FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) - CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_DEMO, FunctionBuildConfig.isDemoMode) + CallerHmiViewControlListenerManager.invokeFuncMode( + FUNC_MODE_DEMO, + FunctionBuildConfig.isDemoMode + ) CallerSopSettingManager.invokeDemoModeListener(isChecked) if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机 @@ -442,11 +434,10 @@ internal class SOPSettingView @JvmOverloads constructor( // 雨天模式,上一次勾选的数据 scRainMode.isChecked = FunctionBuildConfig.isRainMode scRainMode.setOnCheckedChangeListener { compoundButton, isChecked -> - if(!compoundButton.isPressed){ + if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - hmiAction("SOP 雨天模式开关, ",isChecked) - Log.i(TAG,"SOP 雨天模式开关, $isChecked") + hmiAction("SOP 雨天模式开关, ", isChecked) FunctionBuildConfig.isRainMode = isChecked CallerAutoPilotControlManager.setRainMode(isChecked) CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_RAIN, isChecked) @@ -459,60 +450,75 @@ internal class SOPSettingView @JvmOverloads constructor( //弱网减速停车 scWeakNetSlowDown.isChecked = FunctionBuildConfig.isWeakNetSlowDown - scWeakNetSlowDown.setOnCheckedChangeListener{_, isChecked -> + scWeakNetSlowDown.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.isWeakNetSlowDown = isChecked CallerAutoPilotControlManager.sendWeakNetSlowDown(isChecked) - hmiAction("SOP 弱网减速停车, ",isChecked) - Log.i(TAG,"SOP 弱网减速停车, $isChecked") + hmiAction("SOP 弱网减速停车, ", isChecked) } //故障减速停车 scFaultSlowDown.isChecked = FunctionBuildConfig.isFaultSlowDown - scFaultSlowDown.setOnCheckedChangeListener{_, isChecked -> + scFaultSlowDown.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.isFaultSlowDown = isChecked CallerAutoPilotControlManager.sendBreakdownSlowDown(isChecked) - hmiAction("SOP 故障减速停车, ",isChecked) - Log.i(TAG,"SOP 故障减速停车, $isChecked") + hmiAction("SOP 故障减速停车, ", isChecked) } //融合模式 rgFusionMode.setOnCheckedChangeListener { _, p1 -> - when(p1){ + when (p1) { //全融合模式 - R.id.rbFullIntegration ->{ + R.id.rbFullIntegration -> { FunctionBuildConfig.fusionMode = 1 } //盲区模式 - R.id.rbBlind ->{ + R.id.rbBlind -> { FunctionBuildConfig.fusionMode = 2 } //超视距模式 - R.id.rbBeyondSight ->{ + R.id.rbBeyondSight -> { FunctionBuildConfig.fusionMode = 3 } //透传模式 - R.id.rbTransparent ->{ + R.id.rbTransparent -> { FunctionBuildConfig.fusionMode = 4 } //纯路侧模式 - R.id.rbPureRoad ->{ + R.id.rbPureRoad -> { FunctionBuildConfig.fusionMode = 5 } } - hmiAction("SOP 融合模式, ",FunctionBuildConfig.fusionMode) - Log.i(TAG,"SOP 融合模式, ${FunctionBuildConfig.fusionMode}") + hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) } + rgPullTime.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.rbFortyFive -> { + CallerUnmannedListenerManager.dispatchPullTime(45) + } + R.id.rbThirty -> { + CallerUnmannedListenerManager.dispatchPullTime(30) + } + R.id.rbFifteen -> { + CallerUnmannedListenerManager.dispatchPullTime(15) + } + R.id.rbFive -> { + CallerUnmannedListenerManager.dispatchPullTime(5) + } + } + } } + private var overTakeEditText: String = "" + private var overTakeEditDel = false + /** * 其他类别开关设置 */ - private fun otherSetting(){ + private fun otherSetting() { //红绿灯标识开关 scTrafficLight.isChecked = !HmiBuildConfig.isShowTrafficLightView scTrafficLight.setOnCheckedChangeListener { _, isChecked -> - hmiAction("SOP 红绿灯标识开关, ",isChecked) - Log.i(TAG,"SOP 红绿灯标识开关, $isChecked") + hmiAction("SOP 红绿灯标识开关, ", isChecked) if (isChecked) { CallerHmiManager.showTrafficLightView() } else { @@ -523,22 +529,26 @@ internal class SOPSettingView @JvmOverloads constructor( //限速标识 scSpeedLimit.isChecked = HmiBuildConfig.isShowLimitingVelocityView scSpeedLimit.setOnCheckedChangeListener { _, isChecked -> - hmiAction("SOP 限速标识开关, ",isChecked) - Log.i(TAG,"SOP 限速标识开关, $isChecked") + hmiAction("SOP 限速标识开关, ", isChecked) if (isChecked) { HmiBuildConfig.isShowLimitingVelocityView = true - CallerHmiViewControlListenerManager.invokeVisible(IViewControlListener.LimitingVelocityView_TAG,View.VISIBLE) + CallerHmiViewControlListenerManager.invokeVisible( + IViewControlListener.LimitingVelocityView_TAG, + View.VISIBLE + ) } else { HmiBuildConfig.isShowLimitingVelocityView = false - CallerHmiViewControlListenerManager.invokeVisible(IViewControlListener.LimitingVelocityView_TAG,View.GONE) + CallerHmiViewControlListenerManager.invokeVisible( + IViewControlListener.LimitingVelocityView_TAG, + View.GONE + ) } } //异常上报提示 scIPCReport.isChecked = FunctionBuildConfig.isReportWarning scIPCReport.setOnCheckedChangeListener { _, isChecked -> - hmiAction("SOP 是否开启异常上报, ",isChecked) - Log.i(TAG,"SOP 是否开启异常上报, $isChecked") + hmiAction("SOP 是否开启异常上报, ", isChecked) FunctionBuildConfig.isReportWarning = isChecked } @@ -561,10 +571,9 @@ internal class SOPSettingView @JvmOverloads constructor( //是否展示被动触发的录包弹窗(自动驾驶下出现问题触发的录包) scShowBagRecordWindow.isChecked = FunctionBuildConfig.isShowBagRecordWindow - scShowBagRecordWindow.setOnCheckedChangeListener{_, isChecked -> + scShowBagRecordWindow.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.isShowBagRecordWindow = isChecked - hmiAction("SOP 是否展示被动触发的录包弹窗, ",isChecked) - Log.i(TAG,"SOP 是否展示被动触发的录包弹窗, $isChecked") + hmiAction("SOP 是否展示被动触发的录包弹窗, ", isChecked) } //变道绕障的目标障碍物速度阈值 @@ -576,7 +585,7 @@ internal class SOPSettingView @JvmOverloads constructor( FunctionBuildConfig.detouringSpeed-- tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s" } - hmiAction("SOP 变道绕障的目标障碍物速度阈值",FunctionBuildConfig.detouringSpeed) + hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed) } ivSpeedAdd.setOnClickListener { if (FunctionBuildConfig.detouringSpeed >= 7) { @@ -585,17 +594,47 @@ internal class SOPSettingView @JvmOverloads constructor( FunctionBuildConfig.detouringSpeed++ tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s" } - hmiAction("SOP 变道绕障的目标障碍物速度阈值",FunctionBuildConfig.detouringSpeed) + hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed) } btnSpeedSet.setOnClickListener { val isSuccess = CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble()) if (isSuccess == true) { ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置成功") - hmiAction("SOP 变道绕障的目标障碍物速度阈值设置","成功") + hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "成功") } else { ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置失败") - hmiAction("SOP 变道绕障的目标障碍物速度阈值设置","失败") + hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "失败") + } + } + + ivSpeedOverTakeReduce.setOnClickListener { + if (FunctionBuildConfig.overTakeSpeed <= 3) { + ToastUtils.showShort("阈值最小可为3 m/s") + } else { + FunctionBuildConfig.overTakeSpeed -= 0.5f + tvOverTakeLimit.text = "${FunctionBuildConfig.overTakeSpeed} m/s" + } + hmiAction("SOP 超车目标障碍物速度阈值", FunctionBuildConfig.overTakeSpeed) + } + ivSpeedOverTakeAdd.setOnClickListener { + if (FunctionBuildConfig.overTakeSpeed >= 12.5) { + ToastUtils.showShort("阈值最大可为12.5 m/s") + } else { + FunctionBuildConfig.overTakeSpeed += 0.5f + tvOverTakeLimit.text = "${FunctionBuildConfig.overTakeSpeed} m/s" + } + hmiAction("SOP 超车目标障碍物速度阈值", FunctionBuildConfig.overTakeSpeed) + } + btnSpeedOverTakeSet.setOnClickListener { + val isSuccess = + CallerAutoPilotControlManager.sendOvertakeMaxSpeed(FunctionBuildConfig.overTakeSpeed.toDouble()) + if (isSuccess == true) { + ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置成功") + hmiAction("SOP 超车目标障碍物速度阈值设置", "成功") + } else { + ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置失败") + hmiAction("SOP 超车目标障碍物速度阈值设置", "失败") } } @@ -605,6 +644,12 @@ internal class SOPSettingView @JvmOverloads constructor( tvSpeed.visibility = View.GONE ivSpeedAdd.visibility = View.GONE btnSpeedSet.visibility = View.GONE + + tvSpeedOverTakeLimit.visibility = View.GONE + ivSpeedOverTakeReduce.visibility = View.GONE + tvOverTakeLimit.visibility = View.GONE + ivSpeedOverTakeAdd.visibility = View.GONE + btnSpeedOverTakeSet.visibility = View.GONE } /** @@ -614,7 +659,10 @@ internal class SOPSettingView @JvmOverloads constructor( val mf = CallerDevaToolsManager.mofang() if (mf != null) { mfStatusLayout.setClickEnabled(true) - mfStatusLayout.setClickedTextAndTag(if (mf.isConnected()) "断开魔方连接" else "开始连接魔方", if (mf.isConnected()) 0 else 1) + mfStatusLayout.setClickedTextAndTag( + if (mf.isConnected()) "断开魔方连接" else "开始连接魔方", + if (mf.isConnected()) 0 else 1 + ) mf.registerMoFangStatusListener(TAG, this) mfStatusLayout.setOnClickCallback { val tag = it.tag as? Int @@ -654,27 +702,27 @@ internal class SOPSettingView @JvmOverloads constructor( } - override fun onAttachedToWindow() { super.onAttachedToWindow() //添加 业务配置监听 CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener( FuncBizConfig.FOUNDATION, TAG, true, this ) - CallerHmiViewControlListenerManager.addListener(TAG,this) + CallerHmiViewControlListenerManager.addListener(TAG, this) CallerAutopilotGetParamResponseDispatcher.addListener(TAG, this) //查询融合模式 CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.FUSION_MODE) + CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.OVERTAKE_MAX_SPEED) //雨天、美化、点云设置同步 - CallerSopSettingManager.addListener(TAG,this) + CallerSopSettingManager.addListener(TAG, this) } override fun updateFuncMode(tag: String, boolean: Boolean) { super.updateFuncMode(tag, boolean) - if(tag == FUNC_MODE_DEMO){ + if (tag == FUNC_MODE_DEMO) { scDemoMode.isChecked = FunctionBuildConfig.isDemoMode } - if(tag == FUNC_MODE_RAIN){ + if (tag == FUNC_MODE_RAIN) { scRainMode.isChecked = FunctionBuildConfig.isRainMode } } @@ -682,7 +730,10 @@ internal class SOPSettingView @JvmOverloads constructor( override fun onDetachedFromWindow() { super.onDetachedFromWindow() // 移除 业务配置监听 - CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener(FuncBizConfig.FOUNDATION, TAG) + CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener( + FuncBizConfig.FOUNDATION, + TAG + ) CallerHmiViewControlListenerManager.removeListener(TAG) CallerAutopilotGetParamResponseDispatcher.removeListener(TAG) CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this) @@ -696,9 +747,9 @@ internal class SOPSettingView @JvmOverloads constructor( //美化模式 FuncBizConfig.BIZ_BEAUTY_MODE -> { scDemoMode.isClickable = !lock - if(lock){ + if (lock) { scDemoMode.visibility = View.INVISIBLE - }else{ + } else { scDemoMode.visibility = View.VISIBLE } } @@ -788,28 +839,31 @@ internal class SOPSettingView @JvmOverloads constructor( //融合模式 ThreadUtils.runOnUiThread { FunctionBuildConfig.fusionMode = adasParam.fusionMode - when(FunctionBuildConfig.fusionMode){ - 1->{ + when (FunctionBuildConfig.fusionMode) { + 1 -> { //全融合模式 rgFusionMode.check(R.id.rbFullIntegration) } - 2->{ + 2 -> { //盲区模式 rgFusionMode.check(R.id.rbBlind) } - 3->{ + 3 -> { //超视距模式 rgFusionMode.check(R.id.rbBeyondSight) } - 4->{ + 4 -> { //透传模式 rgFusionMode.check(R.id.rbTransparent) } - 5->{ + 5 -> { //纯路侧模式 rgFusionMode.check(R.id.rbPureRoad) } } + + val overTakeSpeed = adasParam.overtakeMaxSpeed + tvOverTakeLimit.text = "$overTakeSpeed m/s" } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/HmiActionLog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/HmiActionLog.kt index c4c7d2450f..6e0d8be103 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/HmiActionLog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/HmiActionLog.kt @@ -1,6 +1,8 @@ package com.mogo.eagle.core.function.hmi.ui.utils import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.zhjt.service.chain.ChainLog class HmiActionLog { @@ -8,12 +10,13 @@ class HmiActionLog { companion object { @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_HMI, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_HMI, nodeAliasCode = ChainConstant.CHAIN_CODE_HMI_ACTIONS, paramIndexes = [0, 1] ) fun hmiAction(data: Any, data1: Any) { + CallerLogger.d(M_HMI + data.toString(), data1) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt index 028f485e6a..ff4e37b641 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt @@ -103,7 +103,7 @@ class PncActionsView @JvmOverloads constructor( it.drivingAction.number ) && mTrafficLightResult != null - && getWaitTrafficLightTime().isNotBlank() + && hasRedLight() ) { actions += ",预计${getWaitTrafficLightTime()}秒后通过" } else { @@ -133,11 +133,15 @@ class PncActionsView @JvmOverloads constructor( mTrafficLightResult = trafficLightResult } + private fun hasRedLight(): Boolean { + return mTrafficLightResult != null + && mTrafficLightResult!!.currentRoadTrafficLight() != null + && mTrafficLightResult!!.currentRoadTrafficLight()!!.isRed() + && mTrafficLightResult!!.currentRoadTrafficLight()!!.time() > 0 + } + private fun getWaitTrafficLightTime(): String { - return if (mTrafficLightResult != null - && mTrafficLightResult!!.currentRoadTrafficLight() != null - && mTrafficLightResult!!.currentRoadTrafficLight()!!.isRed() - ) { + return if (hasRedLight()) { mTrafficLightResult!!.currentRoadTrafficLight()!!.time().toString() } else { "" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/SteeringBrakeView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/SteeringBrakeView.kt index f01abd657c..fff7dc45ea 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/SteeringBrakeView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/SteeringBrakeView.kt @@ -46,7 +46,7 @@ class SteeringBrakeView(context: Context, attrs: AttributeSet?) : ConstraintLayo } override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { - //设置刹车信息,小于默认认为是刹车 //todo 优化sp获取,不要每次回调都去调用sp + //设置刹车信息,小于默认认为是刹车 //todo emArrow 优化sp获取,不要每次回调都去调用sp brakeLight = if (gnssInfo.acceleration < SharedPrefsMgr.getInstance(Utils.getApp()).getFloat( MoGoConfig.BRAKE_ACCELERATION_THRESHOLD, -2.5f @@ -61,7 +61,7 @@ class SteeringBrakeView(context: Context, attrs: AttributeSet?) : ConstraintLayo "---onAutopilotLightSwitchData ---Acceleration = " + gnssInfo.acceleration + "-- brakeLight = " + brakeLight ) ThreadUtils.runOnUiThread { - if (!isShowTurnLight) { //在不展示转向灯的情况下,展示车辆刹车的动效 + if (!isShowTurnLight) { //在不展示转向灯的情况下,展示车辆刹车的动效 todo emArrow 逻辑放入地图 brakeView.visibility = View.VISIBLE brakeView.setBrakeLight(brakeLight) } else { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt index a63be4c512..f8b7c2e69d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt @@ -3,7 +3,6 @@ package com.mogo.eagle.core.function.hmi.ui.vehicle import android.content.Context import android.os.CountDownTimer import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout @@ -21,6 +20,8 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.SoundPoolUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.zhjt.mogo.adas.data.bean.MogoReport @@ -55,13 +56,13 @@ class TakeOverView @JvmOverloads constructor( } override fun onAutopilotStatusResponse(state: Int) { - Log.i(TAG, "onAutopilotStatusResponse state=$state") + CallerLogger.i(M_HMI + TAG, "onAutopilotStatusResponse state=$state") if(state == 7){ isParallel = true - Log.i(TAG, "onAutopilotStatusResponse isParallel status=true") + CallerLogger.i(M_HMI + TAG, "onAutopilotStatusResponse isParallel status=true") }else if(state == 0 || state == 1){ isParallel = false - Log.i(TAG, "onAutopilotStatusResponse isParallel status=false") + CallerLogger.i(M_HMI + TAG, "onAutopilotStatusResponse isParallel status=false") } } @@ -119,10 +120,10 @@ class TakeOverView @JvmOverloads constructor( //弱网 MogoReport.Code.Error.EPARALLEL.AICLOUD_NETWORK_WEAK, MogoReport.Code.Error.EPARALLEL.AICLOUD_CONNECTION_ERROR -> { - Log.i(TAG, "收到弱网上报,当前自驾状态=$isParallel") + CallerLogger.i(M_HMI + TAG, "收到弱网上报,当前自驾状态=$isParallel") //如果是平行驾驶状态下,提示弱网接管 if(isParallel){ - Log.i(TAG,"是平行驾驶状态下,提示弱网接管") + CallerLogger.i(M_HMI + TAG,"是平行驾驶状态下,提示弱网接管") if(AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)){ //M1仅做提示音和消息盒子,无语音播报和提示接管动画 showM1ParallelDrivingWarning(EventTypeEnumNew.NETWORK_WEAK_EVENT.poiType, diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RomaDistanceView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RomaDistanceView.kt index 06166c9c46..9d882176ee 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RomaDistanceView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/RomaDistanceView.kt @@ -6,7 +6,6 @@ import android.os.Looper import android.os.Message import android.text.Html import android.util.AttributeSet -import android.util.Log import android.util.TypedValue import android.view.LayoutInflater import android.view.View @@ -91,7 +90,6 @@ class RomaDistanceView @JvmOverloads constructor( override fun romaDistance(distance: String) { super.romaDistance(distance) dis = distance.toDouble().toInt() - Log.i(TAG, "romaDistance:$dis") } override fun onDetachedFromWindow() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedChartView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedChartView.java index 47a53c4ce8..2f4a126c93 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedChartView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedChartView.java @@ -22,13 +22,13 @@ import com.mogo.eagle.core.function.hmi.R; public class SpeedChartView extends View { //中心的文字描述 - private String mDes = "KM/H"; + private final String mDes = "KM/H"; //根据数据显示的圆弧Paint private Paint mArcPaint; //圆弧颜色 private int mArcColor; //圆弧的画笔的宽度 - private float mStrokeWith = getResources().getDimension(R.dimen.module_ext_arcView_stroke_with); + private final float mStrokeWith = getResources().getDimension(R.dimen.module_ext_arcView_stroke_with); //文字描述的paint private Paint mTextPaint; @@ -37,9 +37,9 @@ public class SpeedChartView extends View { //当前数据 private int currentValue; //最大数据 - private int maxValue = 240; + private final int maxValue = 240; //圆弧背景的开始和结束间的夹角大小 - private float mAngle = 270; + private final float mAngle = 270; //上次绘制圆弧夹角 private float lastAngle = 0; @@ -73,13 +73,13 @@ public class SpeedChartView extends View { mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); //绘制中心的数值 mTextPaint.getTextBounds(mValue, 0, mValue.length(), mRect); - canvas.drawText(mValue, getWidth() / 2, getHeight() / 2 + mRect.height() / 2 - 10, mTextPaint); + canvas.drawText(mValue, getWidth() / 2.0f, getHeight() / 2.0f + mRect.height() / 2.0f - 10, mTextPaint); mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); //绘制中心文字描述 mTextPaint.setTextSize(getResources().getDimension(R.dimen.module_ext_arcView_des_text_size)); mTextPaint.getTextBounds(mDes, 0, mDes.length(), mRect); - canvas.drawText(mDes, getWidth() / 2, getHeight() * 17 / 20 + mRect.height() / 2, mTextPaint); + canvas.drawText(mDes, getWidth() / 2.0f, getHeight() * 17.0f / 20.0f + mRect.height() / 2.0f, mTextPaint); } private void drawArc(Canvas canvas) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt index a7a570fd39..c74b35b6a2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt @@ -365,7 +365,7 @@ class SystemVersionView @JvmOverloads constructor( * HQ、M1 MAP350开始弃用,其他车型MAP360开始弃用 */ override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) { - Log.i(TAG, "hdMapVer=" + status.hdMapVer) + CallerLogger.i(M_HMI + TAG, "hdMapVer=" + status.hdMapVer) //hdMapVer返回示例:/home/mogo/autopilot/share/hadmap_engine/data/hadmap_data/db.sqlite|bj|2.2.7|对bus路线上的junction进行修改,对原609场景修改为6091、6092、6201、 6202四种细分场景,并对通往园区路口改为619 if (status.hdMapVer != null && status.hdMapVer.isNotEmpty()) { //对地图版本进行截取 @@ -384,7 +384,7 @@ class SystemVersionView @JvmOverloads constructor( * @param statusInf 数据 */ override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) { - Log.i(TAG, "hdMapVer=" + statusInf.hdMapVer) + CallerLogger.i(M_HMI + TAG, "hdMapVer=" + statusInf.hdMapVer) //hdMapVer返回示例:/home/mogo/autopilot/share/hadmap_engine/data/hadmap_data/db.sqlite|bj|2.2.7|对bus路线上的junction进行修改,对原609场景修改为6091、6092、6201、 6202四种细分场景,并对通往园区路口改为619 if (statusInf.hdMapVer != null && statusInf.hdMapVer.isNotEmpty()) { //对地图版本进行截取 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt index e03ec1d562..781a780520 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt @@ -31,7 +31,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiFloatViewManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager -import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController import com.mogo.eagle.core.function.call.setting.CallerRequestActivityHandleManager import com.mogo.eagle.core.function.call.startup.CallerStartUpManager.initStageTwo import com.mogo.eagle.core.function.hmi.R @@ -358,7 +357,7 @@ open class MainActivity : MvpActivity(), MainView, } @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_INIT_STATUS, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_INIT, nodeAliasCode = ChainConstant.CHAIN_CODE_REQUEST_PERMISSION, paramIndexes = [0, 1] diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java index d051dd3928..a01eeb46aa 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java @@ -2,7 +2,7 @@ package com.mogo.eagle.core.function.main; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_CODE_START_UP; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_SOURCE_INIT; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_INIT_STATUS; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_STATUS; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAIN; @@ -12,7 +12,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Process; import android.text.TextUtils; -import android.util.Log; import android.view.KeyEvent; import androidx.annotation.NonNull; @@ -150,7 +149,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } @ChainLog( - linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkChainLog = CHAIN_TYPE_STATUS, linkCode = CHAIN_SOURCE_INIT, nodeAliasCode = CHAIN_CODE_START_UP, paramIndexes = {0} @@ -205,7 +204,6 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); - Log.d(TAG, " --- onConfigurationChanged --"); } @Override diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index 8912c45ec6..5c98f74e04 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -5,7 +5,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAI import android.content.Context; import com.bytedance.boost_multidex.BoostMultiDex; -import com.mogo.cloud.socket.SocketBuildConfig; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.module.MogoModule; @@ -15,14 +14,12 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.constants.MogoServicePaths; import com.mogo.eagle.core.function.api.chat.biz.ChatConsts; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; -import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager; import com.mogo.eagle.core.function.call.startup.CallerStartUpManager; +import com.mogo.eagle.core.function.main.threadopt.ThreadOptInitializer; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import java.lang.reflect.Field; - /** * 默认初始化一些基础服务配置 */ @@ -80,6 +77,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); + ThreadOptInitializer.init(); /*如果是主进程**/ // if (ProcessUtils.isMainProcess(this)) { AppLaunchTimeUtils.beginTimeCalculate(AppLaunchTimeUtils.COLD_START); diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/PassengerLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/PassengerLauncherActivity.java index 6a0586953c..41d252124d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/PassengerLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/PassengerLauncherActivity.java @@ -2,7 +2,7 @@ package com.mogo.eagle.core.function.main; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_CODE_START_UP; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_SOURCE_INIT; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_INIT_STATUS; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_STATUS; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; import android.bluetooth.BluetoothAdapter; @@ -13,7 +13,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Process; import android.text.TextUtils; -import android.util.Log; import androidx.annotation.Nullable; @@ -135,7 +134,7 @@ public class PassengerLauncherActivity extends MainActivity implements IMogoInte } @ChainLog( - linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkChainLog = CHAIN_TYPE_STATUS, linkCode = CHAIN_SOURCE_INIT, nodeAliasCode = CHAIN_CODE_START_UP, paramIndexes = {0} @@ -199,7 +198,6 @@ public class PassengerLauncherActivity extends MainActivity implements IMogoInte Method isConnectedMethod = BluetoothDevice.class.getDeclaredMethod("isConnected", (Class[]) null); isConnectedMethod.setAccessible(true); // boolean isConnected = (boolean) isConnectedMethod.invoke(device, (Object[]) null); - Log.d(TAG, "-- device.getName() = " + device.getName()); //device.getAddress() if (device.getName().equals("MINI_KEYBOARD")) { SharedPrefsMgr.getInstance(getContext()).putString("BLUETOOTH", device.getName()); } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/VideoAdAtc.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/VideoAdAtc.kt deleted file mode 100644 index cc73895c23..0000000000 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/VideoAdAtc.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.mogo.eagle.core.function.main - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.utilcode.util.BarUtils -import com.mogo.eagle.core.widget.TextureVideoView - -/** - * 视频广告 TODO 测试用的,可删除 - */ -class VideoAdAtc : AppCompatActivity() { - -// private lateinit var svpFrame: TextureVideoView -// -// override fun onCreate(savedInstanceState: Bundle?) { -// super.onCreate(savedInstanceState) -// setContentView(R.layout.activity_video_ad_atc) -// -// svpFrame = findViewById(R.id.svp_frame) -// -// val url = "android.resource://" + packageName + "/" + R.raw.mogo_ad -// svpFrame.videoPath = url -// svpFrame.start() -// -// BarUtils.hideStatusBarAndSticky(this.window) -// } - -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/modules/MogoModulesManager.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/modules/MogoModulesManager.java index 0f53108175..208bfd8795 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/modules/MogoModulesManager.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/modules/MogoModulesManager.java @@ -150,40 +150,32 @@ public class MogoModulesManager implements MogoModulesHandler { @Override public void onDestroy() { - if (mModuleFunctionProviders != null) { - Collection modules = mModuleFunctionProviders.values(); - if (modules != null) { - for (IMoGoFunctionProvider module : modules) { - try { - CallerLogger.d(M_HMI + TAG, "destroy module: " + module.getFunctionName()); - module.onDestroy(); - } catch (Exception e) { - CallerLogger.e(M_HMI + TAG, e + " onDestroy"); - } + Collection fModules = mModuleFunctionProviders.values(); + if (!fModules.isEmpty()) { + for (IMoGoFunctionProvider module : fModules) { + try { + CallerLogger.d(M_HMI + TAG, "destroy module: " + module.getFunctionName()); + module.onDestroy(); + } catch (Exception e) { + CallerLogger.e(M_HMI + TAG, e + " onDestroy"); } } - mModuleNameFunctionProviders.clear(); } - if (mModuleFunctionProviders != null) { - mModuleFunctionProviders.clear(); - } - if (mModuleFunctionServerProviders != null) { - Collection modules = mModuleFunctionServerProviders.values(); - if (modules != null) { - for (IMoGoFunctionServerProvider module : modules) { - try { - CallerLogger.d(M_HMI + TAG, "destroy module: " + module.getFunctionName()); - module.onDestroy(); - } catch (Exception e) { - CallerLogger.e(M_HMI + TAG, e + " onDestroy"); - } + mModuleNameFunctionProviders.clear(); + mModuleFunctionProviders.clear(); + Collection fsModules = mModuleFunctionServerProviders.values(); + if (!fsModules.isEmpty()) { + for (IMoGoFunctionServerProvider module : fsModules) { + try { + CallerLogger.d(M_HMI + TAG, "destroy module: " + module.getFunctionName()); + module.onDestroy(); + } catch (Exception e) { + CallerLogger.e(M_HMI + TAG, e + " onDestroy"); } } - mModuleNameFunctionProviders.clear(); - } - if (mModuleFunctionServerProviders != null) { - mModuleFunctionServerProviders.clear(); } + mModuleNameFunctionProviders.clear(); + mModuleFunctionServerProviders.clear(); mActivity = null; } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/threadopt/ThreadOptInitializer.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/threadopt/ThreadOptInitializer.java new file mode 100644 index 0000000000..65aa172428 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/threadopt/ThreadOptInitializer.java @@ -0,0 +1,47 @@ +package com.mogo.eagle.core.function.main.threadopt; + + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.mogo.thread.opt.core.ThreadManager; +import com.mogo.thread.opt.core.annotation.Keep; +import com.mogo.thread.opt.core.config.ThreadConfig; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + + +@Keep +public class ThreadOptInitializer { + + + private static final ThreadConfig.TaskExecuteListener listener = new ThreadConfig.TaskExecuteListener() { + @Override + public boolean isEnabled() { + return true; + } + + @Override + public void onExecutorBefore(@NonNull ThreadConfig.TaskType taskType, @Nullable Object task, @Nullable String desc) { + + } + + @Override + public void onExecutorAfter(@NonNull ThreadConfig.TaskType taskType, @Nullable Object task, @Nullable String desc) { + + } + + @Override + public void onExecutorStateChanged(@NonNull ThreadPoolExecutor threadPoolExecutor, int core, int max, int active, long completed) { + + } + }; + + + public static void init() { + ThreadConfig.Builder builder = new ThreadConfig.Builder(); + builder.minKeepAliveTime(1, TimeUnit.SECONDS); + builder.maxKeepAliveTime(10, TimeUnit.SECONDS); + builder.listener(listener); + ThreadManager.INSTANCE.init(builder); + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_video_ad_atc.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_video_ad_atc.xml deleted file mode 100644 index e23dfbdb4e..0000000000 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_video_ad_atc.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fm.xml new file mode 100644 index 0000000000..f1d2d9d1dd --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fm.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fm.xml new file mode 100644 index 0000000000..41d2ef14c5 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fm.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_voice.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_voice.xml new file mode 100644 index 0000000000..e5d2460761 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_voice.xml @@ -0,0 +1,29 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_list.xml index aa8bb90aaa..82cc0ab41b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_list.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_list.xml @@ -8,11 +8,11 @@ + + + + @@ -54,11 +78,11 @@ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_limiting_speed_vr.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_limiting_speed_vr.xml index c7d079cfb7..0573b087f2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_limiting_speed_vr.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_limiting_speed_vr.xml @@ -24,7 +24,6 @@ android:layout_width="120dp" android:layout_height="35dp" android:gravity="center" - android:text="123" android:textColor="@color/color_FFFFFF" android:textSize="@dimen/dp_30" android:textStyle="bold" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml index 5121d303f6..1a05165d25 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml @@ -1,9 +1,8 @@ - + android:layout_height="@dimen/dp_1100"> + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:scaleX="1.4" + android:scaleY="1.4" + android:text="V2X总开关" + android:textSize="@dimen/sp_28" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:scaleX="1.2" + android:scaleY="1.2" + android:text="V2N总开关" + android:textSize="@dimen/sp_28" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/scV2XSwitch" /> + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/scV2NSwitch" /> + app:layout_constraintTop_toBottomOf="@id/scV2NSwitch" /> + app:layout_constraintTop_toBottomOf="@id/scNewV2NData" /> + app:layout_constraintTop_toBottomOf="@id/scGreenWaveSop" /> + app:layout_constraintTop_toBottomOf="@id/scV2ISwitch" /> + app:layout_constraintTop_toBottomOf="@id/scV2ISwitch" /> + app:layout_constraintTop_toBottomOf="@id/scV2iPnc" /> + app:layout_constraintTop_toBottomOf="@id/scObuWeaknessTrafficSop" /> + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@id/scObuV2vView" /> @@ -203,16 +189,16 @@ + app:contentPadding="@dimen/dp_10" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="地图效果类" + android:textColor="@color/black" + android:textSize="@dimen/sp_36" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintLeft_toLeftOf="@id/tvMapTitle" + app:layout_constraintRight_toRightOf="parent" /> + android:text="危险障碍物颜色标记" + android:textSize="@dimen/sp_28" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="@id/mapGuideLine" + app:layout_constraintTop_toBottomOf="@id/tvMapTitle" /> + android:text="引导线动态效果" + android:textSize="@dimen/sp_28" + app:layout_constraintLeft_toLeftOf="@id/mapGuideLine" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@id/tvMapTitle" /> + android:text="点云效果" + android:textSize="@dimen/sp_28" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="@id/mapGuideLine" + app:layout_constraintTop_toBottomOf="@id/scMarkingObstacles" /> + android:text="自车光圈" + android:textSize="@dimen/sp_28" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="@id/mapGuideLine" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@id/scRouteDynamicEffect" /> @@ -309,16 +289,16 @@ + app:contentPadding="@dimen/dp_10" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="与车相关类" + android:textColor="@color/black" + android:textSize="@dimen/sp_36" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintLeft_toLeftOf="@id/tvVehicleTitle" + app:layout_constraintRight_toRightOf="parent" /> + android:text="绕障类功能" + android:textSize="@dimen/sp_28" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="@id/vehicleGuideLine" + app:layout_constraintTop_toBottomOf="@id/tvVehicleTitle" /> + android:text="美化模式" + android:textSize="@dimen/sp_28" + app:layout_constraintLeft_toLeftOf="@id/vehicleGuideLine" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@id/tvVehicleTitle" /> + android:text="雨天模式" + android:textSize="@dimen/sp_28" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="@id/vehicleGuideLine" + app:layout_constraintTop_toBottomOf="@id/scObstacleAvoidance" /> + android:text="弱网减速停车" + android:textSize="@dimen/sp_28" + app:layout_constraintLeft_toLeftOf="@id/vehicleGuideLine" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@id/scDemoMode" /> + android:text="故障减速停车" + android:textSize="@dimen/sp_28" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="@id/vehicleGuideLine" + app:layout_constraintTop_toBottomOf="@id/scRainMode" /> + app:layout_constraintTop_toBottomOf="@id/scFaultSlowDown"> + android:text="全融合模式" + android:textSize="32dp" /> + android:text="盲区模式" + android:textSize="32dp" /> + android:text="超视距模式" + android:textSize="32dp" /> + android:text="透传模式" + android:textSize="32dp" /> + android:text="纯路侧模式" + android:textSize="32dp" /> @@ -483,16 +450,16 @@ + app:contentPadding="@dimen/dp_10" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="其他" + android:textColor="@color/black" + android:textSize="@dimen/sp_36" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintLeft_toLeftOf="@id/tvOtherTitle" + app:layout_constraintRight_toRightOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/tvOtherTitle" /> + app:layout_constraintTop_toBottomOf="@id/tvOtherTitle" /> + app:layout_constraintTop_toBottomOf="@id/scTrafficLight" /> + app:layout_constraintTop_toBottomOf="@id/scSpeedLimit" /> + android:scaleX="1.2" + android:scaleY="1.2" + android:text="录包弹窗" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="@id/otherGuideLine" + app:layout_constraintTop_toBottomOf="@id/scIPCReport" /> + + + + + + + + + + + + @@ -596,16 +611,16 @@ + app:contentPadding="@dimen/dp_10" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="变道速度阈值:" + android:textColor="#1A1A1A" + android:textSize="@dimen/dp_36" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:src="@drawable/icon_reduce" + app:layout_constraintBottom_toBottomOf="@id/tvSpeedThresholdTitle" + app:layout_constraintLeft_toRightOf="@id/tvSpeedThresholdTitle" + app:layout_constraintTop_toTopOf="@id/tvSpeedThresholdTitle" /> + android:background="@drawable/debug_setting_edit_bg" + android:gravity="center" + android:paddingStart="15dp" + android:paddingEnd="15dp" + android:textSize="@dimen/dp_36" + app:layout_constraintBottom_toBottomOf="@id/ivSpeedReduce" + app:layout_constraintLeft_toRightOf="@id/ivSpeedReduce" + app:layout_constraintTop_toTopOf="@id/ivSpeedReduce" /> + app:layout_constraintTop_toTopOf="@id/tvSpeed" />