diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index bfef8a0271..daaf6b231c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -117,8 +117,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private IOCHTaxiPassengerADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关 private IOCHTaxiPassengerAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划 - private Map mOrderStatusCallbackMap = new ConcurrentHashMap<>(); - private Map mControllerStatusCallbackMap = new ConcurrentHashMap<>(); + private final Map mOrderStatusCallbackMap = new ConcurrentHashMap<>(); + private final Map mControllerStatusCallbackMap = new ConcurrentHashMap<>(); private ITaxiPassengerVeloctityCallback mVeloctityCallback;//道路限速返回 @@ -130,7 +130,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private double mLongitude, mLatitude; private MogoLocation mLocation = null; - private List mLocationsModels = new ArrayList<>(); + private final List mLocationsModels = new ArrayList<>(); private TaxiPassengerModel() { } @@ -517,7 +517,6 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback @Override public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - if (autopilotStatusInfo == null) return; int state = autopilotStatusInfo.getState(); // CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "state = %s", state ); if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { diff --git a/app/build.gradle b/app/build.gradle index a74eef3605..fcec11c180 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -149,6 +149,7 @@ android { packagingOptions { exclude 'META-INF/proguard/coroutines.pro' exclude 'META-INF/*' + exclude "/lib/armeabi-v7a/*.so" } signingConfigs { diff --git a/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt index 09ae7d1c42..73d69c4931 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt +++ b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt @@ -1,6 +1,7 @@ package com.mogo.launcher.lancet import android.content.ComponentName +import android.content.Context import android.content.Intent import androidx.annotation.* import com.knightboost.lancet.api.Origin @@ -29,4 +30,25 @@ class CrashFix { null } } + + /** + * https://console.volcengine.com/apmplus/app/crash/detail/java/bb387ccd9c1a3c6ad2ede4e6f501a5e7?aid=302368&date=%7B%22granularity%22%3A%221h%22%2C%22duration%22%3A%22recently%22%2C%22range%22%3A%221w%22%7D&filters=%7B%22type%22%3A%22and%22%2C%22sub_conditions%22%3A%5B%7B%22dimension%22%3A%22os%22%2C%22op%22%3A%22in%22%2C%22type%22%3A%22expression%22%2C%22values%22%3A%5B%22Android%22%5D%7D%5D%7D&org_id=2100068151&os=Android&page_number=6&status=%5B%22pending%22%2C%22processing%22%2C%22solved%22%2C%22reopen%22%5D + * java.lang.IllegalArgumentException: Invalid audio buffer size. + * at android.media.AudioTrack.audioBuffSizeCheck(AudioTrack.java:1857) + at android.media.AudioTrack.(AudioTrack.java:812) + at android.media.AudioTrack.(AudioTrack.java:754) + at android.media.AudioTrack.(AudioTrack.java:708) + at android.media.AudioTrack.(AudioTrack.java:649) + at com.aispeech.lite.tts.a.a(SourceFile:70) + */ + @Insert + @TargetClass("com.aispeech.lite.tts.a") + @TargetMethod(methodName = "a") + fun fixAiSpeechCrash(context: Context, arg1: Int, arg2: Int) { + try { + Origin.callVoid() + } catch (t: Throwable) { + t.printStackTrace() + } + } } \ No newline at end of file diff --git a/app_ipc_monitoring/build.gradle b/app_ipc_monitoring/build.gradle index d52b8fbaea..3790b2cfd8 100644 --- a/app_ipc_monitoring/build.gradle +++ b/app_ipc_monitoring/build.gradle @@ -130,6 +130,7 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation rootProject.ext.dependencies.gson + implementation 'com.github.bumptech.glide:glide:4.11.0' implementation project(':libraries:mogo-adas') implementation project(':libraries:mogo-adas-data') implementation project(':libraries:mogo-obu') diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java index 2952be1594..0f4edc2f79 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java @@ -9,7 +9,6 @@ import com.zhidao.adas.client.bean.ObuMap; import com.zhidao.adas.client.bean.ObuRsi; import com.zhidao.adas.client.bean.ObuRsm; import com.zhidao.adas.client.bean.ObuSpat; -import com.zhidao.adas.client.bean.OriginalPointCloudData; import com.zhidao.adas.client.bean.PerceptionTrafficLight; import com.zhidao.adas.client.bean.PlanningDecisionState; import com.zhidao.adas.client.bean.PlanningObjects; @@ -119,6 +118,7 @@ public class DataDistribution { public final List listPlanningDecisionState = new ArrayList<>(); public final List listChassisStates = new ArrayList<>(); public final List listFSMFunctionStates = new ArrayList<>(); + public final List listBackCameraVideo = new ArrayList<>(); public final List listRoboSweeperTaskIndex = new ArrayList<>(); public final List listBagManagerCmd = new ArrayList<>(); public final List listObuSpat = new ArrayList<>(); @@ -146,6 +146,7 @@ public class DataDistribution { private long listPlanningDecisionStateSize = 0; private long listChassisStatesSize = 0; private long listFSMFunctionStatesSize = 0; + private long listBackCameraVideoSize = 0; private long listRoboSweeperTaskIndexSize = 0; private long listBagManagerCmdSize = 0; private long listObuSpatSize = 0; @@ -175,6 +176,7 @@ public class DataDistribution { listPlanningDecisionStateSize = 1; listChassisStatesSize = 1; listFSMFunctionStatesSize = 1; + listBackCameraVideoSize = 1; listRoboSweeperTaskIndexSize = 1; listBagManagerCmdSize = 1; listObuSpatSize = 1; @@ -423,14 +425,6 @@ public class DataDistribution { if (listener != null && Constants.TITLE.RECEIVE_ERROR.equals(listener.first)) { listener.second.onRefresh(); } - } else if (data instanceof OriginalPointCloudData) { - listOriginalPointCloud.add(0, new DataShow(listOriginalPointCloudSize++, time + str)); - if (listOriginalPointCloud.size() > LIST_SIZE) { - listOriginalPointCloud.remove(listOriginalPointCloud.size() - 1); - } - if (listener != null && Constants.TITLE.RECEIVE_POINT_CLOUD_ORIGINAL.equals(listener.first)) { - listener.second.onRefresh(); - } } } else { MessagePad.MessageType messageType = data.header.getMsgType(); @@ -590,6 +584,22 @@ public class DataDistribution { if (listener != null && Constants.TITLE.RECEIVE_FUNCTION_STATES.equals(listener.first)) { listener.second.onRefresh(); } + } else if (messageType == MessagePad.MessageType.MsgTypePointCloud) { + listOriginalPointCloud.add(0, new DataShow(listOriginalPointCloudSize++, time + str)); + if (listOriginalPointCloud.size() > LIST_SIZE) { + listOriginalPointCloud.remove(listOriginalPointCloud.size() - 1); + } + if (listener != null && Constants.TITLE.RECEIVE_POINT_CLOUD_ORIGINAL.equals(listener.first)) { + listener.second.onRefresh(); + } + } else if (messageType == MessagePad.MessageType.MsgTypeBackCameraVideo) { + listBackCameraVideo.add(0, new DataShow(listBackCameraVideoSize++, time + str)); + if (listBackCameraVideo.size() > LIST_SIZE) { + listBackCameraVideo.remove(listBackCameraVideo.size() - 1); + } + if (listener != null && Constants.TITLE.RECEIVE_BACK_CAMERA_VIDEO.equals(listener.first)) { + listener.second.onRefresh(); + } } else if (data instanceof PerceptionTrafficLight) { listPerceptionTrafficLight.add(0, new DataShow(listPerceptionTrafficLightSize++, time + str)); if (listPerceptionTrafficLight.size() > LIST_SIZE) { diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BaseInfo.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BaseInfo.java index f67a2ee02a..41b65e5472 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BaseInfo.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BaseInfo.java @@ -18,7 +18,11 @@ public abstract class BaseInfo { this.action = action; this.payloadLen = len; nowTime = System.currentTimeMillis(); - this.len = 8 + header.getSerializedSize() + len; + int headerSize = 0; + if (header != null) { + headerSize = header.getSerializedSize(); + } + this.len = 8 + headerSize + len; this.header = header; this.sdf = sdf; } @@ -33,8 +37,12 @@ public abstract class BaseInfo { @Override public String toString() { - return "原始数据长度:" + len + "\tPayload数据长度:" + payloadLen + "\nHeader:[" + "MessageID:" + header.getMsgID() + - " MessageType:" + header.getMsgType() + " 发送时间:" + sdf.format(new Date((long) (header.getTimestamp() * 1000))) - + " 数据源时间:" + sdf.format(new Date((long) (header.getSourceTimestamp() * 1000))) + "]\n"; + String str = "原始数据长度:" + len + "\tPayload数据长度:" + payloadLen + '\n'; + if (header != null) { + str += "Header:[" + "MessageID:" + header.getMsgID() + + " MessageType:" + header.getMsgType() + " 发送时间:" + sdf.format(new Date((long) (header.getTimestamp() * 1000))) + + " 数据源时间:" + sdf.format(new Date((long) (header.getSourceTimestamp() * 1000))) + "]\n"; + } + return str; } } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java index 3973ba0938..b47e46b909 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java @@ -15,6 +15,6 @@ public class ErrorData extends BaseInfo { @Override public String toString() { - return status + "\n原始数据:" + ByteUtil.byteArrToHex(bytes); + return super.toString() + status + "\n原始数据:" + ByteUtil.byteArrToHex(bytes); } } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MyPointCloud.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MyPointCloud.java deleted file mode 100644 index 44143d894a..0000000000 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MyPointCloud.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.zhidao.adas.client.bean; - -import com.google.protobuf.TextFormat; - -import java.text.SimpleDateFormat; - -import mogo.telematics.pad.MessagePad; -import rule_segement.MogoPointCloudOuterClass; - -public class MyPointCloud extends BaseInfo { - public final MogoPointCloudOuterClass.MogoPointCloud bean; - - public MyPointCloud(MessagePad.Header header, MogoPointCloudOuterClass.MogoPointCloud bean, SimpleDateFormat sdf) { - super("接收", bean.getSerializedSize(), header, sdf); - this.bean = bean; - } - - - @Override - public String toString() { - return super.toString() + TextFormat.printer().escapingNonAscii(false).printToString(bean); - } - -} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/OriginalPointCloudData.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/OriginalPointCloudData.java deleted file mode 100644 index b51c9c4cd6..0000000000 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/OriginalPointCloudData.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.zhidao.adas.client.bean; - -import com.zhidao.support.adas.high.common.ByteUtil; - -public class OriginalPointCloudData extends BaseInfo { - private final byte[] pointCloud; - - public OriginalPointCloudData(byte[] pointCloud) { - super("接收", pointCloud.length); - this.pointCloud = pointCloud; - } - - @Override - public String toString() { - return "\n" + ByteUtil.byteArrToHex(pointCloud); - } -} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ReceiveBytesData.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ReceiveBytesData.java new file mode 100644 index 0000000000..ac72a5b7cf --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ReceiveBytesData.java @@ -0,0 +1,23 @@ +package com.zhidao.adas.client.bean; + +import com.zhidao.support.adas.high.common.ByteUtil; + +import java.text.SimpleDateFormat; + +import mogo.telematics.pad.MessagePad; + +public class ReceiveBytesData extends BaseInfo { + public final byte[] data; + + public ReceiveBytesData(MessagePad.Header header, byte[] data, SimpleDateFormat sdf) { + super("接收", data.length, header, sdf); + this.data = data; + } + + + @Override + public String toString() { + return super.toString() + "Payload原始数据:" + ByteUtil.byteArrToHex(data); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/BackCameraFloatWindow.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/BackCameraFloatWindow.java new file mode 100644 index 0000000000..5d57765dbb --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/BackCameraFloatWindow.java @@ -0,0 +1,201 @@ +package com.zhidao.adas.client.ui; + +import android.app.Activity; +import android.graphics.PixelFormat; +import android.os.Handler; +import android.os.Message; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.widget.ImageView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.utils.SysBarUtil; +import com.zhidao.adas.client.utils.image.ImageLoaderManager; + +import java.lang.ref.WeakReference; + +/** + * 摄像头数据展示 + * + * @author xuxinchao + * @description + * @since: 2022/4/20 + */ +public class BackCameraFloatWindow implements View.OnTouchListener { + + private final Activity mContext; + private WindowManager.LayoutParams mWindowParams; + private WindowManager mWindowManager; + + private View mFloatLayout; + private float mInViewX; + private float mInViewY; + private float mDownInScreenX; + private float mDownInScreenY; + private float mInScreenX; + private float mInScreenY; + private ImageView image_view; + + public BackCameraFloatWindow(Activity context) { + this.mContext = context; + initHandler(); + initFloatWindow(); + } + + + private void initFloatWindow() { + LayoutInflater inflater = LayoutInflater.from(mContext); + if (inflater == null) + return; + mFloatLayout = (View) inflater.inflate(R.layout.layout_back_camera, null); + image_view = mFloatLayout.findViewById(R.id.image_view); + mFloatLayout.setOnTouchListener(this); + mWindowParams = new WindowManager.LayoutParams(); +// mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); +// if (Build.VERSION.SDK_INT >= 26) {//8.0新特性 +// mWindowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; +// }else{ +// mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; +// } + + mWindowManager = mContext.getWindowManager(); + + mWindowParams.format = PixelFormat.RGBA_8888; + mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mWindowParams.gravity = Gravity.START | Gravity.TOP; +// mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; +// mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; + mWindowParams.width = 1280; + mWindowParams.height = 720; +// mWindowParams.alpha = 0.9F; + } + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + return floatLayoutTouch(motionEvent); + } + + private boolean floatLayoutTouch(MotionEvent motionEvent) { + switch (motionEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + // 获取相对View的坐标,即以此View左上角为原点 + mInViewX = motionEvent.getX(); + mInViewY = motionEvent.getY(); + // 获取相对屏幕的坐标,即以屏幕左上角为原点 + mDownInScreenX = motionEvent.getRawX(); + mDownInScreenY = motionEvent.getRawY() - SysBarUtil.getSysBarHeight(mContext); + mInScreenX = motionEvent.getRawX(); + mInScreenY = motionEvent.getRawY() - SysBarUtil.getSysBarHeight(mContext); + break; + case MotionEvent.ACTION_MOVE: + // 更新浮动窗口位置参数 + mInScreenX = motionEvent.getRawX(); + mInScreenY = motionEvent.getRawY() - SysBarUtil.getSysBarHeight(mContext); + mWindowParams.x = (int) (mInScreenX - mInViewX); + mWindowParams.y = (int) (mInScreenY - mInViewY); + // 手指移动的时候更新小悬浮窗的位置 + mWindowManager.updateViewLayout(mFloatLayout, mWindowParams); + break; + case MotionEvent.ACTION_UP: + // 如果手指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。 + if (mDownInScreenX == mInScreenX && mDownInScreenY == mInScreenY) { + + } + break; + } + return true; + } + + public void showFloatWindow(float y) { + if (mFloatLayout.getParent() == null) { + DisplayMetrics metrics = new DisplayMetrics(); + // 默认固定位置,靠屏幕右边缘的中间 + mWindowManager.getDefaultDisplay().getMetrics(metrics); + mWindowParams.x = metrics.widthPixels; + mWindowParams.y = (int) (y); + mWindowManager.addView(mFloatLayout, mWindowParams); + } + } + + + public void hideFloatWindow() { + if (mFloatLayout.getParent() != null) + mWindowManager.removeView(mFloatLayout); + } + + public void setFloatLayoutAlpha(boolean alpha) { + if (alpha) + mFloatLayout.setAlpha((float) 0.5); + else + mFloatLayout.setAlpha(1); + } + + + public void onBackCameraVideo(byte[] data) { + Message msg = Message.obtain(); + msg.obj = data; + msg.what = 1; + getHandler().sendMessage(msg); + + + } + + + private BaseHandler mBaseHandler; + + + /** + * 初始化一个Handler,如果需要使用Handler,先调用此方法, + * 然后可以使用postRunnable(Runnable runnable), + * sendMessage在handleMessage(Message msg)中接收msg + */ + public void initHandler() { + mBaseHandler = new BaseHandler(this); + } + + /** + * 返回Handler,在此之前确定已经调用initHandler() + * + * @return Handler + */ + public Handler getHandler() { + return mBaseHandler; + } + + + /** + * 同Handler 的 handleMessage, + * getHandler.sendMessage,发送的Message在此接收 + * 在此之前确定已经调用initHandler() + * + * @param msg + */ + protected void handleMessage(Message msg) { + switch (msg.what) { + case 1: + ImageLoaderManager.loadByteImage(mContext, (byte[]) msg.obj, image_view); + break; + } + } + + + protected static class BaseHandler extends Handler { + private final WeakReference mObjects; + + public BaseHandler(BackCameraFloatWindow mPresenter) { + mObjects = new WeakReference(mPresenter); + } + + @Override + public void handleMessage(Message msg) { + BackCameraFloatWindow mPresenter = mObjects.get(); + if (mPresenter != null) + mPresenter.handleMessage(msg); + } + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java index 06da977405..9d29c6f204 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java @@ -32,6 +32,7 @@ public class InfoFragment extends BaseFragment { private DataShowAdapter adapter; private TextView tvTitle; private String subTitle; + private BackCameraFloatWindow backCameraFloatWindow; public InfoFragment() { } @@ -65,6 +66,27 @@ public class InfoFragment extends BaseFragment { } } + @Override + public void onPause() { + super.onPause(); + hideFloatWindow(); + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if (hidden) { + hideFloatWindow(); + } + } + + private void hideFloatWindow() { + if (backCameraFloatWindow != null) { + backCameraFloatWindow.hideFloatWindow(); + backCameraFloatWindow = null; + } + } + private void initView(View view) { tvTitle = view.findViewById(R.id.tv_title); RecyclerView rvInfo = view.findViewById(R.id.rv_info); @@ -76,6 +98,23 @@ public class InfoFragment extends BaseFragment { subTitle = null; } tvTitle.setGravity(Gravity.CENTER); + if (Constants.TITLE.RECEIVE_BACK_CAMERA_VIDEO.equals(title)) { + Button button = view.findViewById(R.id.btn_render); + button.setVisibility(View.VISIBLE); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (backCameraFloatWindow == null) { + backCameraFloatWindow = new BackCameraFloatWindow(getActivity()); + final int[] location = new int[2]; + button.getLocationOnScreen(location); + backCameraFloatWindow.showFloatWindow(location[1]); + } else { + hideFloatWindow(); + } + } + }); + } //创建默认的线性LayoutManager 横向的GridLayoutManager MyLinearLayoutManager linearLayoutManager = new MyLinearLayoutManager(this.getContext()); // linearLayoutManager.setStackFromEnd(true);//列表再底部开始展示,反转后由上面开始展示 @@ -162,6 +201,8 @@ public class InfoFragment extends BaseFragment { adapter.setData(DataDistribution.getInstance().listPlanningDecisionState); } else if (Constants.TITLE.RECEIVE_FUNCTION_STATES.equals(title)) { adapter.setData(DataDistribution.getInstance().listFSMFunctionStates); + } else if (Constants.TITLE.RECEIVE_BACK_CAMERA_VIDEO.equals(title)) { + adapter.setData(DataDistribution.getInstance().listBackCameraVideo); } else if (Constants.TITLE.RECEIVE_SWEEPER_TASK_INDEX_DATA.equals(title)) { adapter.setData(DataDistribution.getInstance().listRoboSweeperTaskIndex); } else { @@ -197,4 +238,10 @@ public class InfoFragment extends BaseFragment { adapter.refreshView(); } } + + public void onBackCameraVideo(byte[] data) { + if (backCameraFloatWindow != null) { + backCameraFloatWindow.onBackCameraVideo(data); + } + } } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index 3a92a7f8dc..0a6ab82bdd 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -57,8 +57,8 @@ import com.zhidao.adas.client.bean.ObuMap; import com.zhidao.adas.client.bean.ObuRsi; import com.zhidao.adas.client.bean.ObuRsm; import com.zhidao.adas.client.bean.ObuSpat; -import com.zhidao.adas.client.bean.OriginalPointCloudData; import com.zhidao.adas.client.bean.PerceptionTrafficLight; +import com.zhidao.adas.client.bean.ReceiveBytesData; import com.zhidao.adas.client.bean.ReceiveData; import com.zhidao.adas.client.bean.SpecialVehicleBean; import com.zhidao.adas.client.bean.StatusInfo; @@ -84,6 +84,8 @@ import com.zhidao.support.adas.high.common.ProtocolStatus; import com.zhidao.support.adas.high.common.ReceiveTimeoutManager; import com.zhjt.mogo.adas.data.bean.AutopilotStatistics; +import org.jetbrains.annotations.NotNull; + import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; @@ -644,6 +646,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas titleFragmentData.add(Constants.TITLE.RECEIVE_OBU_RSM); titleFragmentData.add(Constants.TITLE.RECEIVE_OBU_MAP); titleFragmentData.add(Constants.TITLE.RECEIVE_SWEEPER_TASK_INDEX_DATA); + titleFragmentData.add(Constants.TITLE.RECEIVE_BACK_CAMERA_VIDEO); titleFragmentData.add(Constants.TITLE.RECEIVE_WARN); titleFragmentData.add(Constants.TITLE.RECEIVE_ERROR); @@ -919,25 +922,31 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas //// LogSave.getInstance().saveLog("转换数据=" + data); // } + // @Override +// public void onPointCloud(byte[] pointCloud) { +//// try { +//// MogoPointCloudOuterClass.MogoPointCloud pointCloud1 = MogoPointCloudOuterClass.MogoPointCloud.parseFrom(pointCloud); +//// HeaderOuterClass.Time time = pointCloud1.getHeader().getStamp(); +//// int s = time.getSec(); +//// int ns = time.getNsec(); +//// long t = (long) (s * 1000L) + (long) (ns / 1000000.d); +//// Log.i(TAG, "PointCloud=" + sdf.format(new Date(t))); +//// } catch (InvalidProtocolBufferException e) { +//// e.printStackTrace(); +//// } +//// try { +//// MogoPointCloudOuterClass.MogoPointCloud bean = MogoPointCloudOuterClass.MogoPointCloud.parseFrom(pointCloud); +//// Log.i("ddd","MogoPointCloud="+ TextFormat.printer().escapingNonAscii(false).printToString(bean)); +//// } catch (InvalidProtocolBufferException e) { +//// e.printStackTrace(); +//// } +// ReceiveBytesData base = new ReceiveBytesData(null, pointCloud, sdf); +// DataDistribution.getInstance().addData(base); +// } +// @Override - public void onPointCloud(byte[] pointCloud) { -// try { -// MogoPointCloudOuterClass.MogoPointCloud pointCloud1 = MogoPointCloudOuterClass.MogoPointCloud.parseFrom(pointCloud); -// HeaderOuterClass.Time time = pointCloud1.getHeader().getStamp(); -// int s = time.getSec(); -// int ns = time.getNsec(); -// long t = (long) (s * 1000L) + (long) (ns / 1000000.d); -// Log.i(TAG, "PointCloud=" + sdf.format(new Date(t))); -// } catch (InvalidProtocolBufferException e) { -// e.printStackTrace(); -// } -// try { -// MogoPointCloudOuterClass.MogoPointCloud bean = MogoPointCloudOuterClass.MogoPointCloud.parseFrom(pointCloud); -// Log.i("ddd","MogoPointCloud="+ TextFormat.printer().escapingNonAscii(false).printToString(bean)); -// } catch (InvalidProtocolBufferException e) { -// e.printStackTrace(); -// } - OriginalPointCloudData base = new OriginalPointCloudData(pointCloud); + public void onPointCloud(MessagePad.Header header, byte[] pointCloud) { + ReceiveBytesData base = new ReceiveBytesData(header, pointCloud, sdf); DataDistribution.getInstance().addData(base); } @@ -1041,6 +1050,16 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas DataDistribution.getInstance().addData(base); } + @Override + public void onBackCameraVideo(@NotNull MessagePad.Header header, @NotNull byte[] data) { + if (fromFragment instanceof InfoFragment) { + InfoFragment fragment = (InfoFragment) fromFragment; + fragment.onBackCameraVideo(data); + } + ReceiveBytesData base = new ReceiveBytesData(header, data, sdf); + DataDistribution.getInstance().addData(base); + } + @Override public void onSweeperTaskIndexData(MessagePad.Header header, RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) { ReceiveData base = new ReceiveData(header, roboSweeperTaskIndex, sdf); diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java index 1a0e9f160e..1f19125e06 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java @@ -153,6 +153,7 @@ public class Constants { String RECEIVE_CHASSIS_STATES = MessageType.TYPE_RECEIVE_CHASSIS_STATES.desc; String RECEIVE_AUTOPILOT_STATE = MessageType.TYPE_RECEIVE_AUTOPILOT_STATE.desc; String RECEIVE_FUNCTION_STATES = MessageType.TYPE_RECEIVE_FUNCTION_STATES.desc; + String RECEIVE_BACK_CAMERA_VIDEO = MessageType.TYPE_RECEIVE_BACK_CAMERA_VIDEO.desc; String RECEIVE_REPORT_MESSAGE = MessageType.TYPE_RECEIVE_REPORT_MESSAGE.desc; String RECEIVE_PERCEPTION_TRAFFIC_LIGHT = MessageType.TYPE_RECEIVE_PERCEPTION_TRAFFIC_LIGHT.desc; String RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY = MessageType.TYPE_RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY.desc; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/BlurTransformation.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/BlurTransformation.java new file mode 100644 index 0000000000..d224c9800f --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/BlurTransformation.java @@ -0,0 +1,99 @@ +package com.zhidao.adas.client.utils.image; + + +/** + * Copyright (C) 2018 Wasabeef + *

+ * 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. + */ + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; + +import androidx.annotation.NonNull; + +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; +import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; + +import java.security.MessageDigest; + +/** + * 高斯模糊 + */ +public class BlurTransformation extends BitmapTransformation { + + private static final int VERSION = 1; + private static final String ID ="com.zhidao.adas.client.utils.image.BlurTransformation." + VERSION; + private static int MAX_RADIUS = 25; + private static int DEFAULT_DOWN_SAMPLING = 1; + + private int radius; + private int sampling; + + public BlurTransformation() { + this(MAX_RADIUS, DEFAULT_DOWN_SAMPLING); + } + + + public BlurTransformation(int radius) { + this(radius, DEFAULT_DOWN_SAMPLING); + } + + public BlurTransformation(int radius, int sampling) { + this.radius = radius; + this.sampling = sampling; + } + + @Override + public String toString() { + return "BlurTransformation(radius=" + radius + ", sampling=" + sampling + ")"; + } + + @Override + protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) { + int width = toTransform.getWidth(); + int height = toTransform.getHeight(); + int scaledWidth = width / sampling; + int scaledHeight = height / sampling; + + Bitmap bitmap = pool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_4444); + + Canvas canvas = new Canvas(bitmap); + canvas.scale(1 / (float) sampling, 1 / (float) sampling); + Paint paint = new Paint(); + paint.setFlags(Paint.FILTER_BITMAP_FLAG); + canvas.drawBitmap(toTransform, 0, 0, paint); + + bitmap = FastBlur.blur(bitmap, radius, true); + + return bitmap; + } + + @Override + public boolean equals(Object o) { + return o instanceof BlurTransformation && + ((BlurTransformation) o).radius == radius && + ((BlurTransformation) o).sampling == sampling; + } + + @Override + public int hashCode() { + return ID.hashCode() + radius * 1000 + sampling * 10; + } + + @Override + public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { + messageDigest.update((ID + radius + sampling).getBytes(CHARSET)); + } +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/FastBlur.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/FastBlur.java new file mode 100644 index 0000000000..66028e2ecb --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/FastBlur.java @@ -0,0 +1,257 @@ +package com.zhidao.adas.client.utils.image; + +import android.graphics.Bitmap; + +/** + * Copyright (C) 2018 Wasabeef + *

+ * 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. + */ + +public class FastBlur { + + public static Bitmap blur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) { + + // 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 + + Bitmap bitmap; + if (canReuseInBitmap) { + bitmap = sentBitmap; + } else { + 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); + } +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/ImageLoaderManager.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/ImageLoaderManager.java new file mode 100644 index 0000000000..b2a7d10cdb --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/image/ImageLoaderManager.java @@ -0,0 +1,199 @@ +package com.zhidao.adas.client.utils.image; + +import android.content.Context; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.Priority; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; +import com.bumptech.glide.request.RequestOptions; + +import java.io.File; + +/** + * create by libo + * create on 2018/12/26 + * description Glide图片加载工具类 + */ +public class ImageLoaderManager { + + /** + * 默认加载方式 + * + * @param context + * @param url + * @param imageView + */ + public static void loadImage(Context context, String url, ImageView imageView) { + RequestOptions requestOptions = new RequestOptions() + .priority(Priority.HIGH) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .dontAnimate(); + + Glide.with(context) + .load(url) + .apply(requestOptions) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(imageView); + } + + /** + * 加载圆形图片 + * + * @param context + * @param url + * @param imageView + */ + public static void loadCircleImage(Context context, String url, ImageView imageView) { + RequestOptions requestOptions = new RequestOptions() + .priority(Priority.HIGH) + .dontAnimate() + .diskCacheStrategy(DiskCacheStrategy.ALL) + .bitmapTransform(new CircleCrop()); + + Glide.with(context) + .load(url) + .apply(requestOptions) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(imageView); + } + + /** + * 加载圆角图片 + * + * @param context + * @param url + * @param imageView + * @param radius 圆角大小 + */ + public static void loadRoundImage(Context context, String url, ImageView imageView, int radius) { + RequestOptions requestOptions = new RequestOptions() + .priority(Priority.HIGH) + .dontAnimate() + .diskCacheStrategy(DiskCacheStrategy.ALL) + .transforms(new CenterCrop(), new RoundedCorners(radius)); + + Glide.with(context) + .load(url) + .apply(requestOptions) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(imageView); + } + + /** + * 加载图片指定大小 + * + * @param context + * @param url + * @param imageView + * @param width + * @param height + */ + public static void loadSizeImage(Context context, String url, ImageView imageView, int width, int height) { + RequestOptions requestOptions = new RequestOptions() + .priority(Priority.HIGH) + .override(width, height) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + + Glide.with(context) + .load(url) + .apply(requestOptions) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(imageView); + } + + /** + * 加载资源文件 + * + * @param context + * @param resId + * @param imageView + */ + public static void loadImage(Context context, int resId, ImageView imageView) { + RequestOptions requestOptions = new RequestOptions() + .priority(Priority.HIGH) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .centerCrop(); + + Glide.with(context) + .load(resId) + .apply(requestOptions) + .into(imageView); + } + + /** + * 加载本地图片文件 + * + * @param context + * @param file + * @param imageView + */ + public static void loadFileImage(Context context, File file, ImageView imageView) { + RequestOptions requestOptions = new RequestOptions() + .priority(Priority.HIGH) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .centerCrop(); + + Glide.with(context) + .load(file) + .apply(requestOptions) + .into(imageView); + } + + /** + * 加载字节数组 + * + * @param context + * @param data + * @param imageView + */ + public static void loadByteImage(Context context, byte[] data, ImageView imageView) { + RequestOptions requestOptions = new RequestOptions() + .priority(Priority.HIGH) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .centerCrop(); + + Glide.with(context) + .load(data) + .apply(requestOptions) + .placeholder(imageView.getDrawable()) + .into(imageView); + } + + /** + * 加载高斯模糊 + * + * @param context + * @param url + * @param imageView + * @param radius 模糊级数 最大25 + */ + public static void loadBlurImage(Context context, String url, ImageView imageView, int radius) { + RequestOptions requestOptions = new RequestOptions() + .override(300) + .transforms(new BlurTransformation(radius)); + + Glide.with(context) + .load(url) + .apply(requestOptions) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(imageView); + } + + /** + * 加载gif图 + * + * @param context + * @param url + * @param imageView + */ + public static void loadGifImage(Context context, String url, ImageView imageView) { + Glide.with(context) + .load(url) + .into(imageView); + } +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/layout/fragment_info.xml b/app_ipc_monitoring/src/main/res/layout/fragment_info.xml index 2199310982..adad72cb90 100644 --- a/app_ipc_monitoring/src/main/res/layout/fragment_info.xml +++ b/app_ipc_monitoring/src/main/res/layout/fragment_info.xml @@ -24,6 +24,21 @@ android:textSize="16sp" android:textStyle="bold" /> + + + + \ No newline at end of file diff --git a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java index 2f9f6dd4d2..6ba404fbea 100644 --- a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java +++ b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java @@ -26,6 +26,7 @@ import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.AppCompatButton; import androidx.recyclerview.widget.GridLayoutManager; @@ -45,11 +46,13 @@ import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.AdasOptions; import com.zhidao.support.adas.high.OnAdasConnectStatusListener; import com.zhidao.support.adas.high.OnAdasListener; -import com.zhjt.mogo.adas.data.bean.AutopilotStatistics; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.common.ProtocolStatus; +import com.zhjt.mogo.adas.data.bean.AutopilotStatistics; + +import org.jetbrains.annotations.NotNull; import java.net.Inet4Address; import java.net.InetAddress; @@ -500,7 +503,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override - public void onPointCloud(byte[] pointCloud) { + public void onPointCloud(MessagePad.Header header, byte[] pointCloud) { } @Override @@ -573,6 +576,11 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } + @Override + public void onBackCameraVideo(@NonNull MessagePad.Header header, @NonNull byte[] data) { + + } + @Override public void onSweeperTaskIndexData(MessagePad.Header header, RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) { diff --git a/config.gradle b/config.gradle index a0654f8743..c0e098760b 100644 --- a/config.gradle +++ b/config.gradle @@ -226,9 +226,9 @@ ext { commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f", compileSdkVersion : 29, buildToolsVersion : "29.0.2", - minSdkVersion : 27, + minSdkVersion : 23, targetSdkVersion : 27, - minSdkVersionPadLenovo : 27, + minSdkVersionPadLenovo : 23, targetSdkVersionPadLenovo : 27, koomxhook : "com.kuaishou.koom:xhook-static:2.2.0", ] diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/network/IDispatchAdasApiService.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/network/IDispatchAdasApiService.kt index dbdc2e34c7..2e1ff638f6 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/network/IDispatchAdasApiService.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/network/IDispatchAdasApiService.kt @@ -14,7 +14,7 @@ interface IDispatchAdasApiService { * @return [BaseData] */ @FormUrlEncoded - @POST("eagle-eye-dns/eagle-eye-dns/dataService/autoDriver/receiveCarPreSetPath") + @POST("eagle-eye-dns/dataService/autoDriver/receiveCarPreSetPath") fun uploadAutopilotRoute(@FieldMap parameters: Map): Observable /** diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/road/ILineUploadApi.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/road/ILineUploadApi.kt index efe9aa66bf..c97a3e6078 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/road/ILineUploadApi.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/road/ILineUploadApi.kt @@ -10,7 +10,7 @@ import retrofit2.http.POST interface ILineUploadApi { @Headers("Content-type:application/json;charset=UTF-8" ) - @POST( "/yycp-data-center-service/carTrack/receiveCarTrack/" ) + @POST( "eagle-eye-dns/yycp-data-center-service/carTrack/receiveCarTrack/" ) fun uploadLineId(@Body lineId: LineUploadData): Observable } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/road/LineUploadManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/road/LineUploadManager.kt index 790ca44ab0..27780b4702 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/road/LineUploadManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/road/LineUploadManager.kt @@ -3,6 +3,7 @@ package com.mogo.eagle.function.biz.v2x.road import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.constants.HostConst.DATA_CENTER_HOST +import com.mogo.commons.constants.HostConst.getEagleHost import com.mogo.eagle.core.data.v2x.LineUploadData import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager @@ -54,7 +55,7 @@ class LineUploadManager private constructor(context: Context) : IMoGoAutopilotSt private fun uploadLine(lineId: Long) { val lineUploadData = LineUploadData(lineId, MoGoAiCloudClientConfig.getInstance().sn) - disposable = MoGoRetrofitFactory.getInstance(DATA_CENTER_HOST) + disposable = MoGoRetrofitFactory.getInstance(getEagleHost()) .create(ILineUploadApi::class.java) .uploadLineId(lineUploadData) .subscribeOn(Schedulers.io()) 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 32fd455865..8ac9e08005 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 @@ -159,9 +159,6 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, handleWarningTargetEvent(event.data) } is V2XEvent.RoadAI -> { - if (FunctionBuildConfig.isV2NFromCar) { - return - } handleRoadMarkerEvent(event.data.toRoadMarker()) } is V2XEvent.RoadEventX -> { @@ -173,12 +170,16 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, } } - @SuppressLint("NewApi") + @ChainLog( + linkChainLog = CHAIN_LINK_LOG_CLOUD_V2N, + linkCode = CHAIN_LINK_CLOUD, + endpoint = TracingConstants.Endpoint.PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_CLOUD_V2N, + paramIndexes = [0], + clientPkFileName = "sn" + ) override fun onAutopilotIdentifyPlanningObj(planningObjects: List?) { super.onAutopilotIdentifyPlanningObj(planningObjects) - if (!FunctionBuildConfig.isV2NFromCar) { - return - } planningObjects?.let { if (it.isNotEmpty()) { val first = it.stream() diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/aicloud/AiCloudSocketBizProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/aicloud/AiCloudSocketBizProvider.kt index 971e7b2af2..624477723d 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/aicloud/AiCloudSocketBizProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/aicloud/AiCloudSocketBizProvider.kt @@ -12,6 +12,7 @@ class AiCloudSocketBizProvider : IMoGoFunctionServerProvider { get() = "AiCloudSocketBizProvider" override fun init(context: Context?) { + //todo bus加载 context?.let { SocketManager.getInstance().init(it, 0.0, 0.0) SocketManager.getInstance().registerOnMessageListener(401012, V2XMessageListener401012()) 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 80cf30f787..575b42b953 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 @@ -134,8 +134,6 @@ class MoGoAdasListenerImpl : OnAdasListener { if (gnssInfo != null) { if (1 == FunctionBuildConfig.gpsProvider) { - // 同步给MAP地图 - //CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map(gnssInfo) // 同步更新经纬度和系统时间至 AutoPilotStatusListener CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( gnssInfo.satelliteTime, @@ -146,7 +144,6 @@ class MoGoAdasListenerImpl : OnAdasListener { } } - /** * 老底盘信息,透传底盘状态,pb参考底盘 * TODO 目前由于M1车型不会在新底盘PB添加新的字段 所以临时保留 @@ -369,7 +366,7 @@ class MoGoAdasListenerImpl : OnAdasListener { //他车轨迹预测 } - override fun onPointCloud(pointCloud: ByteArray?) { + override fun onPointCloud(header: MessagePad.Header, pointCloud: ByteArray?) { //点云数据透传 CallerAutopilotPointCloudListenerManager.invokeAutopilotPointCloudDataUpdate(pointCloud) } @@ -595,6 +592,16 @@ class MoGoAdasListenerImpl : OnAdasListener { ) { } + /** + * 清扫车后部摄像头视频 10Hz + * + * @param header 头 + * @param data 数据 + */ + override fun onBackCameraVideo(header: MessagePad.Header, data: ByteArray) { + CallerSweeperFutianBackCameraVideoListenerManager.invokeSweeperFutianBackCameraVideo(data) + } + /** * 清扫车指标数据 * diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MoGoObuProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MoGoObuProvider.kt index 7a0b107842..6027695b0e 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MoGoObuProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MoGoObuProvider.kt @@ -6,8 +6,6 @@ import com.mogo.eagle.core.data.constants.MoGoConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuProvider -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OBU import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.eagle.core.utilcode.util.CommonUtils @@ -24,13 +22,12 @@ class MoGoObuProvider : IMoGoObuProvider { get() = TAG override fun onDestroy() { - + MogoObuDcCombineManager.INSTANCE.destoryListener() } override fun init(context: Context) { //obu融合数据 MogoObuDcCombineManager.INSTANCE.init(context) - CallerLogger.d("$M_OBU$TAG", "初始化蘑菇自研OBU…… localIp = " + CommonUtils.getLocalIPAddress()) //bus乘客版本obu功能去掉,大理项目需要全部车辆接收,不再限制 mContext = context diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt index dc894bbaf4..f22ffd93a5 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt @@ -56,19 +56,27 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } override fun onMoGoObuRsiWarning(rsiWarningData: ObuScene.RsiWarningData) { - onMogoObuDcRsiWarning(rsiWarningData) + if (HmiBuildConfig.isShowObuV2iView) { + onMogoObuDcRsiWarning(rsiWarningData) + } } override fun onMoGoObuRsmWarning(rsmWarningData: ObuScene.RsmWarningData) { - onMogoObuDcRsmWarning(rsmWarningData) + if (HmiBuildConfig.isShowObuV2iView) { + onMogoObuDcRsmWarning(rsmWarningData) + } } override fun onMoGoObuSpatWarning(spatWarningData: ObuScene.SpatWarningData) { - onMogoObuDcSpatWarning(spatWarningData) + if (HmiBuildConfig.isShowObuV2iView) { + onMogoObuDcSpatWarning(spatWarningData) + } } override fun onMoGoObuMapMath(mapMatchData: ObuScene.MapMatchData) { - onMogoObuMapMath(mapMatchData) + if (HmiBuildConfig.isShowObuV2iView) { + onMogoObuMapMath(mapMatchData) + } } /** @@ -119,13 +127,13 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener ttsContent = EventTypeEnumNew.getWarningTts(appId) alertContent = String.format( //事件才有影响范围 alertContent, - Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(), - Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString() + Math.round(rsiWarningData.warningMsgList[0].distance).toString(), + Math.round(rsiWarningData.warningMsgList[0].eventRadius).toString() ) ttsContent = String.format( ttsContent, - Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(), - Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString() + Math.round(rsiWarningData.warningMsgList[0].distance).toString(), + Math.round(rsiWarningData.warningMsgList[0].eventRadius).toString() ) } @@ -202,11 +210,11 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener ttsContent = EventTypeEnumNew.getWarningTts(appId) alertContent = String.format( //标牌是没有影响范围的 alertContent, - Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString() + Math.round(rsiWarningData.warningMsgList[0].distance).toString() ) ttsContent = String.format( ttsContent, - Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString() + Math.round(rsiWarningData.warningMsgList[0].distance).toString() ) } @@ -217,13 +225,13 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener ttsContent = EventTypeEnumNew.getWarningTts(appId) alertContent = String.format( //事件才有影响范围 alertContent, - Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(), - Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString() + Math.round(rsiWarningData.warningMsgList[0].distance).toString(), + Math.round(rsiWarningData.warningMsgList[0].eventRadius).toString() ) ttsContent = String.format( ttsContent, - Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(), - Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString() + Math.round(rsiWarningData.warningMsgList[0].distance).toString(), + Math.round(rsiWarningData.warningMsgList[0].eventRadius).toString() ) } @@ -237,16 +245,18 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener CallerLogger.d( "${M_OBU}${TAG}", - "MogoObuDcCombineManager ttsContent = $ttsContent --alertContent = $alertContent --appId = $appId ---direction = ${direction.direction} --distance = ${rsiWarningData.warningMsgList[0].distance} ---eventRadius = ${rsiWarningData.warningMsgList[0].eventRadius} --speedMaxLimit = ${rsiWarningData.warningMsgList[0].speedMaxLimit}" - ) + "MogoObuDcCombineManager ttsContent = $ttsContent --alertContent = $alertContent --appId = $appId ---direction = ${direction.direction} --distance = ${rsiWarningData.warningMsgList[0].distance} ---eventRadius = ${rsiWarningData.warningMsgList[0].eventRadius} --speedMaxLimit = ${rsiWarningData.warningMsgList[0].speedMaxLimit}") when (status) { // 添加 MogoObuConstants.STATUS.ADD -> { if (alertContent.isEmpty() || ttsContent.isEmpty()) { return } - saveObuToDcData(appId, alertContent, ttsContent) - showWarning(appId, alertContent, ttsContent, direction) + //大于10m,才提示rsi + if (Math.round(rsiWarningData.warningMsgList[0].distance) > 10) { + saveObuToDcData(appId, alertContent, ttsContent) + showWarning(appId, alertContent, ttsContent, direction) + } } MogoObuConstants.STATUS.UPDATE -> { // 更新 @@ -380,33 +390,31 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener * 地图匹配 是OBU算法输出地图匹配结果,主车匹配道路哪条路或者哪条车道 */ fun onMogoObuMapMath(data: ObuScene.MapMatchData?) { - if (HmiBuildConfig.isShowObuLimitSpeedView) { - if (data != null) { - CallerLogger.d( - "${M_OBU}${TAG}", - "MogoObuDcCombineManager onMogoObuMapMath = ${data.status} --speedMaxLimit = ${ - Math.round( - (data.speedMaxLimit * 0.02 * 3.6) - ) - } --- data.speedMaxLimit = ${data.speedMaxLimit}" - ) - when (data.status) { - MogoObuConstants.STATUS.ADD -> { // 添加 - CallerLimitingVelocityListenerManager.invokeUnion( - (data.speedMaxLimit * 0.02 * 3.6).roundToInt().toInt(), - DataSourceType.OBU - ) - } + if (data != null) { + CallerLogger.d( + "${M_OBU}${TAG}", + "MogoObuDcCombineManager onMogoObuMapMath = ${data.status} --speedMaxLimit = ${ + Math.round( + (data.speedMaxLimit * 3.6) + ) + } --- data.speedMaxLimit = ${data.speedMaxLimit}" + ) + when (data.status) { + MogoObuConstants.STATUS.ADD -> { // 添加 + CallerLimitingVelocityListenerManager.invokeUnion( + (data.speedMaxLimit * 3.6).roundToInt(), + DataSourceType.OBU + ) + } - MogoObuConstants.STATUS.UPDATE -> { // 更新 - } + MogoObuConstants.STATUS.UPDATE -> { // 更新 + } - MogoObuConstants.STATUS.DELETE -> { // 删除 - CallerLimitingVelocityListenerManager.invokeUnion( - -1, - DataSourceType.OBU - ) - } + MogoObuConstants.STATUS.DELETE -> { // 删除 + CallerLimitingVelocityListenerManager.invokeUnion( + -1, + DataSourceType.OBU + ) } } } @@ -521,15 +529,15 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener "MogoObuDcCombineManager 绿波通行引导 --------> speed_min = ${currentLight.suggestMinSpeed} --speed_max = ${currentLight.suggestMaxSpeed}" ) val adviceSpeed = - "${Math.round(currentLight.suggestMinSpeed * 3.6 * 0.02)} - ${ + "${Math.round(currentLight.suggestMinSpeed * 3.6)} - ${ Math.round( - currentLight.suggestMaxSpeed * 3.6 * 0.02 + currentLight.suggestMaxSpeed * 3.6 ) }" val adviceSpeedTts = - "${Math.round(currentLight.suggestMinSpeed * 3.6 * 0.02)} - ${ + "${Math.round(currentLight.suggestMinSpeed * 3.6)} - ${ Math.round( - currentLight.suggestMaxSpeed * 3.6 * 0.02 + currentLight.suggestMaxSpeed * 3.6 ) }" @@ -566,7 +574,7 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } // 红灯 2, 3 -> { - val red = (currentLight.countDown / 10).toInt() + val red = currentLight.countDown.toInt() CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( TrafficLightEnum.RED, red, @@ -575,7 +583,7 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } // 绿灯 4, 5, 6 -> { - val green = (currentLight.countDown / 10).toInt() + val green = currentLight.countDown.toInt() CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( TrafficLightEnum.GREEN, green, @@ -584,7 +592,7 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } // 黄灯 7, 8 -> { - val yellow = (currentLight.countDown / 10).toInt() + val yellow = currentLight.countDown.toInt() CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( TrafficLightEnum.YELLOW, yellow, diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index 868498b8ac..5f182177b6 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -407,6 +407,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { alertContent = EventTypeEnumNew.getWarningContent(appId) ttsContent = EventTypeEnumNew.getWarningTts(appId) + alertContent = String.format( //标牌是没有影响范围的 alertContent, Math.round(data.warningMsgList[0].distance).toString() @@ -455,8 +456,11 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { if (alertContent.isEmpty() || ttsContent.isEmpty()) { return } - saveObuData(appId, alertContent, ttsContent) - showWarning(appId, alertContent, ttsContent, direction) + //大于10m,才提示rsi + if (Math.round(data.warningMsgList[0].distance) > 10) { + saveObuData(appId, alertContent, ttsContent) + showWarning(appId, alertContent, ttsContent, direction) + } // 更新数据 TrafficDataConvertUtilsNew.cvxRtiThreatIndInfo2TrafficData(data) @@ -661,7 +665,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { /** * 构造对应展示数据和场景 根据obu的场景,add change delete确定是否展示 - * @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容 TODO 添加事件频繁播报拦截 + * @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容 * @see com.mogo.module.common.enums.EventTypeEnumNew * EventTypeEnumNew在定义的id为了防止重复,和原始数据是不一样的,有对应关系 */ @@ -806,7 +810,6 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType) v2xType = EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType } - } when (status) { diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt index 521aa5c3a4..4112baf491 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt @@ -50,9 +50,11 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight private var mContext: Context? = null //是否有AI获取红绿灯灯态 + @Volatile private var hasAiLightStatus: Boolean = false //obu数据 + @Volatile private var hasObuLightStatus: Boolean = false fun initServer(context: Context) { 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 7c25c50613..50281064c0 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 @@ -1,26 +1,35 @@ package com.mogo.eagle.core.function.msgbox +import android.annotation.SuppressLint import android.content.Context import android.os.Looper +import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.msgbox.* -import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.msgbox.db.MsgBoxDb import com.mogo.eagle.core.function.msgbox.db.MsgBoxInfo import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.ProcessUtils +import com.mogo.eagle.core.utilcode.util.SPUtils import com.mogo.eagle.core.utilcode.util.Utils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.io.File +import java.text.SimpleDateFormat +import java.util.* object DataManager { // private val msgBoxMap: EnumMap> = EnumMap(MsgBoxType::class.java) + const val TAG = "DataManager" + // 消失时间5000ms const val DISMISS_TIME = 5000L @@ -148,6 +157,10 @@ object DataManager { * 从本地数据库中查询数据 */ fun queryAllMessages(context: Context) { + if (!ProcessUtils.isMainProcess(context)) { + return + } + clearMessageBoxTable(context) scope.launch { initCache() try { @@ -158,6 +171,38 @@ object DataManager { } } + @SuppressLint("SimpleDateFormat") + private fun clearMessageBoxTable(context: Context) { + Thread { + val lastLaunchTimeStr = SPUtils.getInstance().getString("last_launch", "") + val format = SimpleDateFormat("yyyy-MM-dd") + val currDate = Date(System.currentTimeMillis()) + val currTimeStr = format.format(currDate) + try { + if (lastLaunchTimeStr != null && lastLaunchTimeStr.isNotEmpty()) { + val isSameDay = currTimeStr == lastLaunchTimeStr + // 超过一天需要清除消息盒子中的数据,并把时间戳存入SP + if (!isSameDay) { + val file: File = context.getDatabasePath(MsgBoxDb.INTERNAL_DB_NAME) + if (file != null && file.exists()) { + context.deleteDatabase(MsgBoxDb.INTERNAL_DB_NAME) + } + SPUtils.getInstance().put("last_launch", currTimeStr) + } + } else { + // 首次使用App或中途仅删除sp文件 + val file: File = context.getDatabasePath(MsgBoxDb.INTERNAL_DB_NAME) + if (file != null && file.exists()) { + context.deleteDatabase(MsgBoxDb.INTERNAL_DB_NAME) + } + SPUtils.getInstance().put("last_launch", currTimeStr) + } + } catch (e: Exception) { + e(TAG, e.message) + } + }.start() + } + private fun initCache() { if (cacheNotifyList.isNotEmpty()) { cacheNotifyList.clear() @@ -170,86 +215,87 @@ object DataManager { } } - private suspend fun getCacheMessages(context: Context): List = withContext(Dispatchers.IO) { - delay(2000) - return@withContext MsgBoxDb.getDb(context) - .monitorDao() - .getAllCachedMessages() - .map { msgInfo -> - val json = msgInfo.bean2Json - when (msgInfo.obj2JsonType) { - MsgBoxType.V2X.ordinal -> { - return@map MsgBoxBean( - MsgBoxType.V2X, - GsonUtils.fromJson(json, V2XMsg::class.java) - ).apply { - this.timestamp = msgInfo.timeStamp - withContext(Dispatchers.Main) { - cacheNotifyList.add(this@apply) + private suspend fun getCacheMessages(context: Context): List = + withContext(Dispatchers.IO) { + delay(2000) + return@withContext MsgBoxDb.getDb(context) + .monitorDao() + .getAllCachedMessages() + .map { msgInfo -> + val json = msgInfo.bean2Json + when (msgInfo.obj2JsonType) { + MsgBoxType.V2X.ordinal -> { + return@map MsgBoxBean( + MsgBoxType.V2X, + GsonUtils.fromJson(json, V2XMsg::class.java) + ).apply { + this.timestamp = msgInfo.timeStamp + withContext(Dispatchers.Main) { + cacheNotifyList.add(this@apply) + } } } - } - MsgBoxType.OBU.ordinal -> { - return@map MsgBoxBean( - MsgBoxType.OBU, - GsonUtils.fromJson(json, V2XMsg::class.java) - ).apply { - this.timestamp = msgInfo.timeStamp - withContext(Dispatchers.Main) { - cacheNotifyList.add(this@apply) + MsgBoxType.OBU.ordinal -> { + return@map MsgBoxBean( + MsgBoxType.OBU, + GsonUtils.fromJson(json, V2XMsg::class.java) + ).apply { + this.timestamp = msgInfo.timeStamp + withContext(Dispatchers.Main) { + cacheNotifyList.add(this@apply) + } } } - } - MsgBoxType.OPERATION.ordinal -> { - return@map MsgBoxBean( - MsgBoxType.OPERATION, - GsonUtils.fromJson(json, OperationMsg::class.java) - ).apply { - this.timestamp = msgInfo.timeStamp - withContext(Dispatchers.Main) { - cacheNotifyList.add(this@apply) + MsgBoxType.OPERATION.ordinal -> { + return@map MsgBoxBean( + MsgBoxType.OPERATION, + GsonUtils.fromJson(json, OperationMsg::class.java) + ).apply { + this.timestamp = msgInfo.timeStamp + withContext(Dispatchers.Main) { + cacheNotifyList.add(this@apply) + } } } - } - MsgBoxType.REPORT.ordinal -> { - return@map MsgBoxBean( - MsgBoxType.REPORT, - GsonUtils.fromJson(json, ReportEntity::class.java) - ).apply { - this.timestamp = msgInfo.timeStamp - withContext(Dispatchers.Main) { - cacheSysInfoList.add(this@apply) + MsgBoxType.REPORT.ordinal -> { + return@map MsgBoxBean( + MsgBoxType.REPORT, + GsonUtils.fromJson(json, ReportEntity::class.java) + ).apply { + this.timestamp = msgInfo.timeStamp + withContext(Dispatchers.Main) { + cacheSysInfoList.add(this@apply) + } } } - } - MsgBoxType.RECORD.ordinal -> { - return@map MsgBoxBean( - MsgBoxType.RECORD, - GsonUtils.fromJson(json, RecordBagMsg::class.java) - ).apply { - this.timestamp = msgInfo.timeStamp - withContext(Dispatchers.Main) { - cacheRecordList.add(this@apply) + MsgBoxType.RECORD.ordinal -> { + return@map MsgBoxBean( + MsgBoxType.RECORD, + GsonUtils.fromJson(json, RecordBagMsg::class.java) + ).apply { + this.timestamp = msgInfo.timeStamp + withContext(Dispatchers.Main) { + cacheRecordList.add(this@apply) + } } } - } - MsgBoxType.NOTICE.ordinal -> { - return@map MsgBoxBean( - MsgBoxType.NOTICE, - GsonUtils.fromJson(json, NoticeFrCloudMsg::class.java) - ).apply { - this.timestamp = msgInfo.timeStamp - withContext(Dispatchers.Main) { - cacheNotifyList.add(this@apply) + MsgBoxType.NOTICE.ordinal -> { + return@map MsgBoxBean( + MsgBoxType.NOTICE, + GsonUtils.fromJson(json, NoticeFrCloudMsg::class.java) + ).apply { + this.timestamp = msgInfo.timeStamp + withContext(Dispatchers.Main) { + cacheNotifyList.add(this@apply) + } } } - } - else -> { - return@map MsgBoxBean(MsgBoxType.V2X, V2XMsg()) + else -> { + return@map MsgBoxBean(MsgBoxType.V2X, V2XMsg()) + } } } - } - } + } /** * 存储到本地数据库 @@ -298,7 +344,8 @@ object DataManager { fun delMsgBoxBean(context: Context, msgBoxBean: MsgBoxBean) { scope.launch { withContext(Dispatchers.Default) { - val msgBoxInfo = MsgBoxInfo(msgBoxBean.bean2Json, msgBoxBean.type.ordinal, msgBoxBean.timestamp) + val msgBoxInfo = + MsgBoxInfo(msgBoxBean.bean2Json, msgBoxBean.type.ordinal, msgBoxBean.timestamp) MsgBoxDb.getDb(context) .monitorDao() .deleteMsg(msgBoxInfo) 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 668c80ee3c..0e4b4aa983 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 @@ -173,9 +173,6 @@ class DevaToolsProvider : IDevaToolsProvider { override fun updateUpgradeProgress() { upgradeManager.updateUpgradeProgress(mContext!!) - } - - override fun updateObuUpgradeStatus() { upgradeManager.updateObuUpgradeStatus(mContext!!) } 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 9191619b4e..a6b0fccc0f 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 @@ -86,10 +86,18 @@ class BindingCarNetWorkManager private constructor() { SharedPrefsConstants.CAR_INFO, GsonUtils.toJson(info.getData()) ) + } else { +// SharedPrefsMgr.getInstance(context).putString( +// SharedPrefsConstants.CAR_INFO, "null") + e( + SceneConstant.M_BINDING + TAG, "getBindingCarInfo data = null " + ) } } override fun onError(e: Throwable) { +// SharedPrefsMgr.getInstance(context).putString( +// SharedPrefsConstants.CAR_INFO, e.message.toString()) e( SceneConstant.M_BINDING + TAG, "getBindingCarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt index 27ffcea085..28ab73c903 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt @@ -9,6 +9,7 @@ import android.content.Intent import android.content.IntentFilter import android.view.KeyEvent import com.mogo.commons.context.ContextHolderUtil +import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.deva.mofang.MfConstants import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.sendOperatorChangeLaneLeft @@ -46,7 +47,6 @@ class MoFangManager private constructor() : IMoGoMoFangListener { private lateinit var mBluetoothAdapter: BluetoothAdapter private var isMfConnect: Boolean = false //添加状态判断 - private val isShowToast = false //toast 控制,自测使用 private var startPressTime: Long = 0 //开始按键时间 private var isPressEnd = false //按键是否结束 @Volatile @@ -171,23 +171,23 @@ class MoFangManager private constructor() : IMoGoMoFangListener { startPressTime = System.currentTimeMillis() } e(M_F + "MoFangManager", - "dispatchKeyEvent ------ bluetoothName = $bluetoothName ---code = $keyCode -----action = $action ") + "dispatchKeyEvent ------ bluetoothName = $bluetoothName ---code = $keyCode -----action = $action ---HmiBuildConfig.isShowMfToastView = ${HmiBuildConfig.isShowMfToastView}") if (keyCode == KeyEvent.KEYCODE_A) { //单击 -1,长按无操作,AB组合-2 if (action == KeyEvent.ACTION_DOWN) { pressADownTime = System.currentTimeMillis() d(M_F + "MoFangManager", "dispatchKeyEvent A down pressADownTime = " + pressADownTime + "---" + (pressADownTime - startPressTime) + "----isCombinationKey = " + isCombinationKey + "--pressBDownTime = " + pressBDownTime) if (pressADownTime - startPressTime in (clickTimeInterval + 1) until longPressTime && pressBDownTime > 0) { - if (isShowToast) { - ToastUtils.showShort("方块 A 按AB组合 +1 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 A 按AB组合 +1 timeInterval: ${pressADownTime - startPressTime}ms---$pressBDownTime") } sendAcc(true, +1.0) isCombinationKey = 3 } if (isCombinationKey != 3 && isCombinationKey != 1) { if (pressADownTime - startPressTime > longPressTimeInterval) { - if (isShowToast) { - ToastUtils.showShort("方块 长按A -2 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 长按A -2 timeInterval: ${pressADownTime - startPressTime}ms") } sendAcc(true, -2.0) isCombinationKey = 2 @@ -199,8 +199,8 @@ class MoFangManager private constructor() : IMoGoMoFangListener { "dispatchKeyEvent A up pressAUpTime = " + pressAUpTime + "---" + (pressAUpTime - startPressTime) + "--pressBDownTime = " + pressBDownTime + "---isCombinationKey = $isCombinationKey") if (pressAUpTime - startPressTime < clickTime && isCombinationKey != 3) { isCombinationKey = 1 - if (isShowToast) { - ToastUtils.showShort("方块 单击A -1 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 单击A -1 timeInterval: ${pressAUpTime - startPressTime}ms") } sendAcc(true, -1.0) } @@ -215,16 +215,16 @@ class MoFangManager private constructor() : IMoGoMoFangListener { "dispatchKeyEvent B down pressBDownTime = " + pressBDownTime + "--差-" + (pressBDownTime - startPressTime) + "---isCombinationKey = " + isCombinationKey + "--pressADownTime = " + pressADownTime ) if (pressBDownTime - startPressTime > clickTimeInterval && pressBDownTime - startPressTime < longPressTime && pressADownTime > 0) { - if (isShowToast) { - ToastUtils.showShort("方块 B 按AB组合 +1 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 B 按AB组合 +1 timeInterval: ${pressBDownTime - startPressTime}ms ---pressADownTime = $pressADownTime ") } sendAcc(true, +1.0) isCombinationKey = 3 } if (isCombinationKey != 3 && isCombinationKey != 1) { if (pressBDownTime - startPressTime > longPressTimeInterval) { - if (isShowToast) { - ToastUtils.showShort("方块 长按B 无操作 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 长按B 无操作 timeInterval: ${pressBDownTime - startPressTime}ms") } isCombinationKey = 2 } @@ -234,8 +234,8 @@ class MoFangManager private constructor() : IMoGoMoFangListener { d(M_F + "MoFangManager", "dispatchKeyEvent B up pressBUpTime = " + pressBUpTime + "--差-" + (pressBUpTime - startPressTime) + "--pressADownTime = " + pressADownTime + "----isCombinationKey = $isCombinationKey") if (pressBUpTime - startPressTime < clickTime && isCombinationKey != 3) { - if (isShowToast) { - ToastUtils.showShort("方块 单击B 0 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 单击B 0 timeInterval: ${pressBUpTime - startPressTime}ms") } sendAcc(false, 0.0) isCombinationKey = 1 @@ -250,8 +250,8 @@ class MoFangManager private constructor() : IMoGoMoFangListener { d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按C 无操作 time dif = " + (pressCDownTime - startPressTime)) if (pressCDownTime - startPressTime > longPressTimeInterval) { - if (isShowToast) { - ToastUtils.showShort("方块 长按C 无操作 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 长按C 无操作 timeInterval: ${pressCDownTime - startPressTime}ms") } } } else if (action == KeyEvent.ACTION_UP) { @@ -260,8 +260,8 @@ class MoFangManager private constructor() : IMoGoMoFangListener { d(M_F + "MoFangManager", "dispatchKeyEvent 方块 单击C ← 向左变道 time dif = " + (pressCUpTime - startPressTime)) if (pressCUpTime - startPressTime < clickTime) { - if (isShowToast) { - ToastUtils.showShort("方块 单击C ← 向左变道 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 单击C ← 向左变道 timeInterval: ${pressCUpTime - startPressTime}ms") } sendOperatorChangeLaneLeft() } @@ -272,8 +272,8 @@ class MoFangManager private constructor() : IMoGoMoFangListener { d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按D 无操作 time dif = " + (pressDDownTime - startPressTime)) if (pressDDownTime - startPressTime > longPressTimeInterval) { - if (isShowToast) { - ToastUtils.showShort("方块 长按D 无操作 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 长按D 无操作 timeInterval: ${pressDDownTime - startPressTime}ms") } } } else if (action == KeyEvent.ACTION_UP) { @@ -282,8 +282,8 @@ class MoFangManager private constructor() : IMoGoMoFangListener { d(M_F + "MoFangManager", "dispatchKeyEvent 方块 单击D → 向右变道 time dif = " + (pressDUpTime - startPressTime)) if (pressDUpTime - startPressTime < clickTime) { - if (isShowToast) { - ToastUtils.showShort("方块 单击D → 向右变道 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 单击D → 向右变道 timeInterval: ${pressDUpTime - startPressTime}ms") } sendOperatorChangeLaneRight() } @@ -294,8 +294,8 @@ class MoFangManager private constructor() : IMoGoMoFangListener { d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按E 鸣笛 time dif = " + (pressEDownTime - startPressTime)) if (pressEDownTime - startPressTime > longPressTimeInterval) { - if (isShowToast) { - ToastUtils.showShort("方块 长按E 鸣笛 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 长按E 鸣笛 timeInterval: ${pressEDownTime - startPressTime}ms") } sendOperatorSetHorn(1.0) if (timerHorn == null) { @@ -314,8 +314,8 @@ class MoFangManager private constructor() : IMoGoMoFangListener { d(M_F + "MoFangManager", "方块 单击E 开启自动驾驶 time dif = " + (pressEUpTime - startPressTime)) if (pressEUpTime - startPressTime < clickTime) { - if (isShowToast) { - ToastUtils.showShort("方块 单击E 开启自动驾驶 ") + if (HmiBuildConfig.isShowMfToastView) { + ToastUtils.showShort("方块 单击E 开启自动驾驶 timeInterval: ${pressEUpTime - startPressTime}ms") } startAutoPilot(getAutoPilotStatusInfo().autopilotControlParameters) } 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 b554611acd..31db42443e 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 @@ -83,7 +83,7 @@ class SceneManager { } } //call back - CallerDevaToolsListenerManager.invokeDevaToolsModuleLogChanges(sceneModuleTAG.map) +// CallerDevaToolsListenerManager.invokeDevaToolsModuleLogChanges(sceneModuleTAG.map) } } 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 e0acfc917a..c36e6f8542 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 @@ -1,8 +1,6 @@ package com.zhjt.mogo_core_function_devatools.upgrade -import android.app.NotificationManager import android.content.Context -import androidx.core.app.NotificationCompat import com.elegant.utils.UiThreadHandler import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.function.api.devatools.IMogoDevaToolsUpgradeListener @@ -128,31 +126,20 @@ class UpgradeManager : IDownload { } /** - * 鹰眼app下载监听 liyz + * 鹰眼app下载监听 */ fun updateUpgradeProgress(context: Context) { - val builder = NotificationCompat.Builder(context) - // builder.setSmallIcon(R.mipmap.icon1001);//todo emArrow 更换图标,去除地图下载图标的依赖关系 - builder.setContentTitle("下载") - builder.setContentText("正在下载") - val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager CallerDevaToolsUpgradeListenerManager.addListener( TAG, object : IMogoDevaToolsUpgradeListener { override fun onStart(url: String?) {} override fun onPause(url: String?) {} override fun onProgress(url: String?, length: Int) { - builder.setProgress(100, length, false) - manager.notify(0x3, builder.build()) - //下载进度提示 - builder.setContentText("已下载$length%") updateStatusBarDownloadView(true, "download", length) } override fun onFinished(url: String?) { - builder.setContentText("已下载" + 100 + "%") UiThreadHandler.postDelayed({ - manager.cancel(0x3) updateStatusBarDownloadView(false, "download", 100) }, 1000) } 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 80b72654c5..05975cc293 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 @@ -98,20 +98,20 @@ - + + + + + + + + + + + + - + { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_operation,parent,false) + BubbleOperationHolder(view) + } else -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_v2x,parent,false) BubbleV2XHolder(view) @@ -120,6 +125,13 @@ class MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter } } } + is BubbleOperationHolder ->{ + data?.let { + val operationMsg = it[position].bean as OperationMsg + holder.tvMOperationTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMOperationContent.text = operationMsg.content + } + } } val msgBoxBean: MsgBoxBean = data!![position] @@ -146,6 +158,8 @@ class MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter notice }else if(data!![position].type == MsgBoxType.V2X && data!![position].sourceType == DataSourceType.SUMMARY){ summary + }else if(data!![position].type == MsgBoxType.OPERATION){ + operation } else{ v2x } @@ -175,4 +189,10 @@ class MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter var tvMSummaryTime: TextView = itemView.findViewById(R.id.tvMSummaryTime) } + //通知消息 + class BubbleOperationHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvMOperationTime: TextView = itemView.findViewById(R.id.tvMOperationTime) + var tvMOperationContent: TextView = itemView.findViewById(R.id.tvMOperationContent) + } + } \ 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/adapter/MMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxListAdapter.kt index 9e44371868..9b2c0c0e9d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxListAdapter.kt @@ -9,10 +9,7 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.EventTypeEnumNew -import com.mogo.eagle.core.data.msgbox.MsgBoxBean -import com.mogo.eagle.core.data.msgbox.MsgBoxType -import com.mogo.eagle.core.data.msgbox.NoticeFrCloudMsg -import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.data.msgbox.* import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.hmi.R @@ -28,6 +25,7 @@ class MMsgBoxListAdapter(private val activity: Activity): RecyclerView.Adapter){ this.data = data @@ -44,6 +42,10 @@ class MMsgBoxListAdapter(private val activity: Activity): RecyclerView.Adapter { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_list_operation,parent,false) + ListOperationHolder(view) + } else -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_list_v2x,parent,false) ListV2XHolder(view) @@ -111,6 +113,13 @@ class MMsgBoxListAdapter(private val activity: Activity): RecyclerView.Adapter { + data?.let { + val operationMsg = it[position].bean as OperationMsg + holder.tvMOperationTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMOperationContent.text = operationMsg.content + } + } } } @@ -121,7 +130,9 @@ class MMsgBoxListAdapter(private val activity: Activity): RecyclerView.Adapter if (isChecked) { buttonView.setCompoundDrawables(null, null, iconDown, null) - btnOpenAllGestures.visibility = View.VISIBLE + tbOpenMfView.visibility = View.VISIBLE } else { buttonView.setCompoundDrawables(null, null, iconRight, null) - btnOpenAllGestures.visibility = View.GONE + tbOpenMfView.visibility = View.GONE } } - btnOpenAllGestures.setOnClickListener { - CallerMapUIServiceManager.getMapUIController()?.setAllGesturesEnabled(true) + /** + * 蘑方控制 默认关闭 + */ + tbOpenMfView.isChecked = HmiBuildConfig.isShowMfToastView + tbOpenMfView.setOnCheckedChangeListener { _, isChecked -> + HmiBuildConfig.isShowMfToastView = isChecked } /** @@ -361,6 +371,7 @@ internal class DebugSettingView @JvmOverloads constructor( swDevelopMode.visibility = View.GONE } } + /** * 开发者模式 */ @@ -634,12 +645,6 @@ internal class DebugSettingView @JvmOverloads constructor( FunctionBuildConfig.isBeautyMode = isChecked } - tbV2NFromCar.isChecked = FunctionBuildConfig.isV2NFromCar - //v2n车端预警 - tbV2NFromCar.setOnCheckedChangeListener { _, isChecked -> - FunctionBuildConfig.isV2NFromCar = isChecked - } - tbDrawAiCloudFusion.isChecked = FunctionBuildConfig.isDrawAiCloudFusion //云端感知绘制 tbDrawAiCloudFusion.setOnCheckedChangeListener { _, isChecked -> @@ -1597,6 +1602,7 @@ internal class DebugSettingView @JvmOverloads constructor( tvAutopilotInfo.text = autopilotJson tvIpcInfo.text = autopilotJson tvIpcInfoKey.text = autopilotJson + tvCmdbCarInfoContent.text = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.CAR_INFO) tvCarInfo.text = "GPS时间:${(mGnssInfo?.satelliteTime?.times(1000))?.toLong()}\n" + @@ -2056,4 +2062,5 @@ internal class DebugSettingView @JvmOverloads constructor( override fun onObuDeviceId(obuDeviceId: String) { mObuDeviceId = obuDeviceId } + } \ 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/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 116662754b..8861936c58 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 @@ -73,11 +73,11 @@ internal class SOPSettingView @JvmOverloads constructor( /** * obu弱势交通控制 */ - tbObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView - tbObuWeaknessTrafficSop.setOnCheckedChangeListener { _, isChecked -> - // 默认开启 - HmiBuildConfig.isShowObuWeaknessTrafficView = !isChecked - } +// tbObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView +// tbObuWeaknessTrafficSop.setOnCheckedChangeListener { _, isChecked -> +// // 默认开启 +// HmiBuildConfig.isShowObuWeaknessTrafficView = !isChecked +// } /** * 云端弱势交通控制 @@ -88,14 +88,6 @@ internal class SOPSettingView @JvmOverloads constructor( HmiBuildConfig.isShowCloudWeaknessTrafficView = isChecked } - /** - * 限速数据来源开关 - */ - tbRoadLimitSpeedSop.setOnCheckedChangeListener { _, isChecked -> - // 默认关闭 - HmiBuildConfig.isShowObuLimitSpeedView = isChecked - } - /** * obu V2V开关,默认打开 */ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/WrapContentLinearLayoutManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/WrapContentLinearLayoutManager.kt deleted file mode 100644 index 75a93e3901..0000000000 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/WrapContentLinearLayoutManager.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.mogo.eagle.core.function.hmi.ui.setting - -import android.content.Context -import android.util.AttributeSet -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView - -/** - * @author XuXinChao - * @description fix java.lang.IndexOutOfBoundsException:检测到不一致。视图持有者适配器positionViewHolder无效 - * @since: 2022/6/7 - */ -class WrapContentLinearLayoutManager : LinearLayoutManager { - constructor(context: Context?) : super(context) {} - - constructor(context: Context?, orientation: Int, reverseLayout: Boolean) : super( - context, - orientation, - reverseLayout - ) {} - - constructor( - context: Context?, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) {} - - override fun onLayoutChildren(recycler: RecyclerView.Recycler?, state: RecyclerView.State?) { - try { - super.onLayoutChildren(recycler, state) - } catch (e: IndexOutOfBoundsException) { - e.printStackTrace() - } - } -} \ 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/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index 1ad27de6c1..effcdf840c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -51,6 +51,7 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor( private var clickListener: ClickListener? = null private var keyBoardUtil: KeyBoardUtil? = null + @Volatile private var connectStatus = false private var lastTime = 0L 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 5d073ae54e..58bfe45c84 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 @@ -40,6 +40,7 @@ class PncActionsView @JvmOverloads constructor( @Volatile private var mTrafficLightResult: TrafficLightResult? = null + @Volatile private var mAutoPilotStatusInfo: AutopilotStatusInfo? = null private val bgResources: Int diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryView.kt index c88cc7a1bb..18c0f70988 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BatteryView.kt @@ -11,6 +11,7 @@ import android.view.View import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ThreadUtils import kotlin.math.abs @@ -139,17 +140,19 @@ class BatteryView : View , IMoGoSkinModeChangeListener { } override fun onSkinModeChange(skinMode: Int) { - when (skinMode) { - 0 -> { - batteryColor = resources.getColor(R.color.color_27FFFFFF) - powerColor = Color.WHITE - } - 1 -> { - batteryColor = resources.getColor(R.color.color_1E111111) - powerColor = resources.getColor(R.color.color_2C2E30) + ThreadUtils.runOnUiThread { + when (skinMode) { + 0 -> { + batteryColor = resources.getColor(R.color.color_27FFFFFF) + powerColor = Color.WHITE + } + 1 -> { + batteryColor = resources.getColor(R.color.color_1E111111) + powerColor = resources.getColor(R.color.color_2C2E30) + } } + invalidate() } - invalidate() } override fun onAttachedToWindow() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CheckSystemView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CheckSystemView.kt index b07b0292b1..f6a1f0bd87 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CheckSystemView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CheckSystemView.kt @@ -29,7 +29,9 @@ class CheckSystemView @JvmOverloads constructor( const val TAG = "CheckSystemView" } + @Volatile private var connectStatus = false //是否连接工控机 + @Volatile private var autopilotStatus: Int? = null //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中 private var dockerRebootDialog: DockerRebootDialog? = null diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt index b7f531c972..325c33de50 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt @@ -27,6 +27,7 @@ class SpeedPanelView @JvmOverloads constructor( var mContext: Context var mSpeedChartView: SpeedChartView + @Volatile var mLatLng: MogoLocation? = null init { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt index 1205cba30a..cc791d43cd 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt @@ -14,6 +14,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.util.BarUtils +import com.mogo.eagle.core.utilcode.util.ThreadUtils import kotlinx.android.synthetic.main.view_status_bar.view.* import java.util.concurrent.CopyOnWriteArrayList @@ -55,9 +56,11 @@ class StatusBarView @JvmOverloads constructor( } override fun onSkinModeChange(skinMode: Int) { - when (skinMode) { - 0 -> setStatusBarDarkOrLight(false) - 1 -> setStatusBarDarkOrLight(true) + ThreadUtils.runOnUiThread { + when (skinMode) { + 0 -> setStatusBarDarkOrLight(false) + 1 -> setStatusBarDarkOrLight(true) + } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt index bc404b047d..383f583392 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt @@ -31,6 +31,7 @@ class VersionNameView @JvmOverloads constructor( const val TAG = "VersionNameView" } + @Volatile private var dockerVersion: String? = null //工控机版本 init{ 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 814487cf90..c7d20aea1f 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 @@ -293,11 +293,13 @@ open class MainActivity : MvpActivity(), MainView, } override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - val status = autoPilotStatusInfo.ipcConnStatus - if (mLastStatus != status) { - val statusInfo = autoPilotStatusInfo.clone() - rvConnectInfo.post { updateConnectInfoView(statusInfo) } - mLastStatus = status + UiThreadHandler.post { + val status = autoPilotStatusInfo.ipcConnStatus + if (mLastStatus != status) { + val statusInfo = autoPilotStatusInfo.clone() + rvConnectInfo.post { updateConnectInfoView(statusInfo) } + mLastStatus = status + } } } 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 1e80ca8ec3..26370c9ed6 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 @@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.main; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; -import android.annotation.SuppressLint; import android.content.Context; import android.os.Process; @@ -18,20 +17,15 @@ 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.msgbox.db.MsgBoxDb; 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 com.mogo.eagle.core.utilcode.util.ProcessUtils; -import com.mogo.eagle.core.utilcode.util.SPUtils; -import java.io.File; import java.lang.reflect.Field; -import java.text.SimpleDateFormat; -import java.util.Date; /** - * 默认初始化一些基础服务配置 todo 分离 msgBox去自己的模块中 --- 扶风 + * 默认初始化一些基础服务配置 */ public abstract class MainMoGoApplication extends AbsMogoApplication { @@ -50,12 +44,8 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { initLogConfig(); initTipToast(); initModules(); - if (ProcessUtils.isMainProcess(this)) { - clearMessageBoxTable(); - CallerMsgBoxManager.INSTANCE.queryAllMessages(this); - } + CallerMsgBoxManager.INSTANCE.queryAllMessages(this); CallerDevaToolsManager.INSTANCE.updateUpgradeProgress(); - CallerDevaToolsManager.INSTANCE.updateObuUpgradeStatus(); } @Override @@ -64,38 +54,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { return true; } - @SuppressLint("SimpleDateFormat") - private void clearMessageBoxTable() { - new Thread(() -> { - String lastLaunchTimeStr = SPUtils.getInstance().getString("last_launch", ""); - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - Date currDate = new Date(System.currentTimeMillis()); - String currTimeStr = format.format(currDate); - try { - if (lastLaunchTimeStr != null && !lastLaunchTimeStr.isEmpty()) { - boolean isSameDay = currTimeStr.equals(lastLaunchTimeStr); - // 超过一天需要清除消息盒子中的数据,并把时间戳存入SP - if (!isSameDay) { - File file = this.getDatabasePath(MsgBoxDb.INTERNAL_DB_NAME); - if (file != null && file.exists()) { - this.deleteDatabase(MsgBoxDb.INTERNAL_DB_NAME); - } - SPUtils.getInstance().put("last_launch", currTimeStr); - } - } else { - // 首次使用App或中途仅删除sp文件 - File file = this.getDatabasePath(MsgBoxDb.INTERNAL_DB_NAME); - if (file != null && file.exists()) { - this.deleteDatabase(MsgBoxDb.INTERNAL_DB_NAME); - } - SPUtils.getInstance().put("last_launch", currTimeStr); - } - } catch (Exception e) { - CallerLogger.INSTANCE.e(TAG, e.getMessage()); - } - }).start(); - } - /** * 初始化异常采集配置 */ @@ -126,11 +84,11 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_V2X_OBU_MOGO, "IMoGoObuProvider")); // BIZ MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_FUNC_BIZ, "IMoGoNoticeProvider")); - // todo 后置 车聊聊,IM + // 后置 车聊聊,IM MogoModulePaths.addModuleFunctionServer(new MogoModule(ChatConsts.CHAT_PROVIDER_PATH, ChatConsts.CHAT_MODULE_NAME)); // 司机身份专属 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - // todo 后置 地图数据收集模块 + // 后置 地图数据收集模块 MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_MAP_DATA_COLLECT_PROVIDER, "MoGoMapDataCollector")); } CallerLogger.INSTANCE.i(M_HMI + TAG, "App launch timer cost " + (System.currentTimeMillis() - start) + "ms"); @@ -141,7 +99,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { super.attachBaseContext(base); /*如果是主进程**/ // if (ProcessUtils.isMainProcess(this)) { - AppLaunchTimeUtils.beginTimeCalculate(AppLaunchTimeUtils.COLD_START); + AppLaunchTimeUtils.beginTimeCalculate(AppLaunchTimeUtils.COLD_START); // } BoostMultiDex.install(base); AbsMogoApplication.sApp = this; 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 index 907a96144d..cc73895c23 100644 --- 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 @@ -11,19 +11,19 @@ import com.mogo.eagle.core.widget.TextureVideoView */ 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) - } +// 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/res/layout/item_m_msg_box_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_operation.xml new file mode 100644 index 0000000000..d8d1747997 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_operation.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_operation.xml new file mode 100644 index 0000000000..d2a3127cbc --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_operation.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 971434f8bc..27d514d3b1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -206,6 +206,29 @@ android:layout_height="1dp" android:background="#F0F0F0" /> + + + + + + + - - -