From bbcd3b0172471a9c7b38e7a54ee4693d9bee5e5f Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 1 Apr 2022 15:36:32 +0800 Subject: [PATCH 1/7] =?UTF-8?q?[fix]=E6=9B=B4=E6=94=B9=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=EF=BC=8C=E8=BF=9E=E6=8E=A5=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=90=8E=E5=85=88=E8=B0=83=E7=94=A8=E8=BF=9E=E6=8E=A5=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E5=9B=9E=E8=B0=83=EF=BC=8C=E5=9C=A8=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?CarConfig=E4=BF=A1=E6=81=AF=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/zhidao/support/adas/high/AdasChannel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index c90a05caab..764b6c91e5 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -438,10 +438,10 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec ipcConnectionStatus = Constants.IPC_CONNECTION_STATUS.CONNECTED; ipcConnectedIp = ipAddress; ipcConnectedPort = port; - sendCarConfigReq(); if (adasConnectStatusListener != null) { adasConnectStatusListener.onConnectionIPCStatus(ipcConnectionStatus, null); } + sendCarConfigReq(); } @Override From 4eee19628464657379958fabd3da55426d446e81 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 1 Apr 2022 15:38:43 +0800 Subject: [PATCH 2/7] =?UTF-8?q?[add]=E5=B7=A5=E6=8E=A7=E6=9C=BA=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=A8=8B=E5=BA=8F=E5=8A=A0=E5=85=A5=E6=8A=93=E5=8F=96?= =?UTF-8?q?LOG=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_ipc_monitoring/build.gradle | 2 +- .../adas/client/adapter/InfoTitleAdapter.java | 22 +- .../adas/client/adapter/LineAdapter.java | 10 +- .../com/zhidao/adas/client/log/LogModel.java | 51 +++ .../com/zhidao/adas/client/log/LogSave.java | 167 ++++++++++ .../zhidao/adas/client/ui/MainActivity.java | 118 ++++--- .../src/main/res/layout/activity_main.xml | 4 +- .../src/main/res/layout/item_info.xml | 10 +- .../src/main/res/layout/item_info1.xml | 21 ++ .../src/main/res/layout/item_main.xml | 301 ++++++++++-------- 10 files changed, 520 insertions(+), 186 deletions(-) create mode 100644 app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogModel.java create mode 100644 app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java create mode 100644 app_ipc_monitoring/src/main/res/layout/item_info1.xml diff --git a/app_ipc_monitoring/build.gradle b/app_ipc_monitoring/build.gradle index e9e83e92b6..e024c8573b 100644 --- a/app_ipc_monitoring/build.gradle +++ b/app_ipc_monitoring/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId "com.zhidao.adas.client" minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 25 multiDexEnabled true versionCode 1 versionName "1.0" diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java index 354abc0b1d..d620f99132 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java @@ -27,6 +27,7 @@ public class InfoTitleAdapter extends BaseAdapter data, boolean isFragment) { super(data); this.isFragment = isFragment; @@ -37,7 +38,7 @@ public class InfoTitleAdapter extends BaseAdapter queue; + private BufferedWriter buff = null; + private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()); + private final SimpleDateFormat FILE_SDF = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSS", Locale.getDefault()); + private File file; + private boolean isLogSwitch = false; + private long capacity = MAX_CAPACITY; + private Future future; + + private LogSave() { + queue = new LinkedBlockingQueue<>(); + start(); + } + + public static LogSave getInstance() { + if (INSTANCE == null) { + synchronized (LogSave.class) { + if (INSTANCE == null) { + INSTANCE = new LogSave(); + } + } + } + return INSTANCE; + } + + + public void setIsLogSwitch(boolean isLogSwitch) { + this.isLogSwitch = isLogSwitch; + } + + public boolean isLogSwitch() { + return isLogSwitch; + } + + + public boolean isSdcardUse() { + boolean bl = false; + if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { + bl = true; + } + return bl; + } + + private void getFile() throws IOException { + if (isSdcardUse()) { + String time = FILE_SDF.format(new Date()); + String childPath = time.split("_")[0] + File.separator; + file = new File(ROOT_PATH + childPath + String.format(LOG_FILE_NAME, time)); + if (!file.exists()) { + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + file.createNewFile(); + } + FileWriter fw = new FileWriter(file, true); + buff = new BufferedWriter(fw); + } + } + + + public void saveLog(String action, String data) { + if (isLogSwitch) { + long nowTime = System.currentTimeMillis(); + String time = sdf.format(new Date(nowTime)); +// L.i(TAG, "time=" + time); + data = data.replace("\n", ""); + String builder = time + " [action]:" + action + " [data]:" + data; + queue.add(builder); + } + } + + public void start() { + if (future == null) { + future = ThreadPoolManager.getsInstance().submit(new WriteThread()); + } + } + + public void stop() { + queue.clear(); + if (future != null && !future.isCancelled()) { + future.cancel(true); + } + future = null; + closeBufferedWriter(); + } + + private void closeBufferedWriter() { + if (buff != null) { + try { + buff.flush(); + buff.close(); + } catch (IOException e) { + e.printStackTrace(); + } + buff = null; + } + + } + + private class WriteThread implements Runnable { + + @Override + public void run() { + synchronized (this) { + while (!Thread.currentThread().isInterrupted()) { + try { + long size = 0; + if (file != null) { + size = file.length(); + } + if (size > capacity || file == null || !file.exists() || buff == null) { + closeBufferedWriter(); + getFile(); + } + String data = queue.take(); + if (!TextUtils.isEmpty(data)) { + buff.write(data); + buff.newLine(); + buff.flush(); + } + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } + Log.i(TAG, "退出线程"); + } + } + } + +} \ No newline at end of file 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 f9fba66d23..a9e90474d3 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 @@ -14,6 +14,7 @@ import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.WindowManager; +import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.RadioButton; @@ -32,6 +33,9 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; +import com.zhidao.adas.client.bean.Base; +import com.zhidao.adas.client.log.LogSave; +import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; import com.google.gson.Gson; import com.mogo.telematic.MogoProtocolMsg; import com.mogo.telematic.NSDNettyManager; @@ -82,6 +86,7 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadLocalRandom; import chassis.VehicleStateOuterClass; import io.netty.channel.Channel; @@ -104,7 +109,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas private AppCompatButton disconnect; private RadioButton fixation; private RadioButton assign; - private Switch switchLog; + private CheckBox cb_print; + private CheckBox cb_save; private RecyclerView infoBtn; private RecyclerView infoFragment; private TextView tvConnectState; @@ -220,7 +226,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas disconnect = findViewById(R.id.disconnect); fixation = findViewById(R.id.fixation); assign = findViewById(R.id.assign); - switchLog = findViewById(R.id.switch_log); + cb_print = findViewById(R.id.cb_print); + cb_save = findViewById(R.id.cb_save); title = findViewById(R.id.title); infoBtn = findViewById(R.id.info_btn); infoFragment = findViewById(R.id.info_fragment); @@ -271,18 +278,22 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas manager = getSupportFragmentManager(); transaction = manager.beginTransaction(); - - switchLog.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + cb_print.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - if (b) { - AdasManager.getInstance().setEnableLog(true); - switchLog.setText("日志:开"); - + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + AdasManager.getInstance().setEnableLog(isChecked); + } + }); + cb_save.setChecked(LogSave.getInstance().isLogSwitch()); + cb_save.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + LogSave.getInstance().start(); } else { - AdasManager.getInstance().setEnableLog(false); - switchLog.setText("日志:关"); + LogSave.getInstance().stop(); } + LogSave.getInstance().setIsLogSwitch(isChecked); } }); connectionType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @@ -291,7 +302,6 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas int type; switch (checkedId) { default: - case R.id.assign: type = AdasOptions.IPC_CONNECTION_MODE.ASSIGN; break; @@ -537,29 +547,28 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } - private void onUpdateConnectStateView() { + private String onUpdateConnectStateView() { String status; int color; switch (connectStatus) { - case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTED: + case IPC_CONNECTION_STATUS.CONNECTED: status = "已连接"; color = R.color.connect_status_connected; break; default: - case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED: + case IPC_CONNECTION_STATUS.DISCONNECTED: status = "未连接"; color = R.color.connect_status_disconnected; break; - case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTING: + case IPC_CONNECTION_STATUS.CONNECTING: status = "连接中"; color = R.color.connect_status_connecting; break; - - case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.SEARCH_ADDRESS: + case IPC_CONNECTION_STATUS.SEARCH_ADDRESS: status = "搜索IP"; color = R.color.connect_status_search_address; break; - case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.NOT_FOUND_ADDRESS: + case IPC_CONNECTION_STATUS.NOT_FOUND_ADDRESS: status = "未找到"; color = R.color.connect_status_disconnecting; break; @@ -572,6 +581,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas tvConnectState.setTextColor(getResources().getColor(color)); } }); + return status; } @@ -588,6 +598,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onSSHResult(final SSHResult info) { + LogSave.getInstance().saveLog("接收", info.toString()); runOnUiThread(new Runnable() { @Override public void run() { @@ -599,47 +610,64 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onError(ProtocolStatus status, byte[] bytes) { - EventBus.getDefault().postSticky(new ErrorData(status, bytes)); + ErrorData base = new ErrorData(status, bytes); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) { - EventBus.getDefault().postSticky(new Trajectory(header, trajectory)); + Trajectory base = new Trajectory(header, trajectory); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onTrackedObjects(MessagePad.Header header, MessagePad.TrackedObjects trackedObjects) { - EventBus.getDefault().postSticky(new TrackedObjects(header, trackedObjects)); + TrackedObjects base = new TrackedObjects(header, trackedObjects); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onGnssInfo(MessagePad.Header header, MessagePad.GnssInfo gnssInfo) { - EventBus.getDefault().postSticky(new GnssInfo(header, gnssInfo)); + GnssInfo base = new GnssInfo(header, gnssInfo); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onVehicleState(MessagePad.Header header, VehicleStateOuterClass.VehicleState vehicleState) { - EventBus.getDefault().postSticky(new VehicleState(header, vehicleState)); + VehicleState base = new VehicleState(header, vehicleState); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onAutopilotState(MessagePad.Header header, MessagePad.AutopilotState autopilotState) { - EventBus.getDefault().postSticky(new AutopilotState(header, autopilotState)); + AutopilotState base = new AutopilotState(header, autopilotState); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage mogoReportMessage) { - EventBus.getDefault().postSticky(new MogoReportMessage(header, mogoReportMessage)); + MogoReportMessage base = new MogoReportMessage(header, mogoReportMessage); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onPerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights trafficLights) { - EventBus.getDefault().postSticky(new PerceptionTrafficLight(header, trafficLights)); + PerceptionTrafficLight base = new PerceptionTrafficLight(header, trafficLights); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onBasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq basicInfoReq) { BasicInfoReq info = new BasicInfoReq(header, basicInfoReq); + LogSave.getInstance().saveLog("接收", info.toString()); AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); runOnUiThread(new Runnable() { @Override @@ -652,33 +680,44 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onCarConfigResp(MessagePad.Header header, MessagePad.CarConfigResp carConfigResp) { - EventBus.getDefault().postSticky(new CarConfigResp(header, carConfigResp)); + CarConfigResp base = new CarConfigResp(header, carConfigResp); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onRecordResult(MessagePad.Header header, RecordPanelOuterClass.RecordPanel recordPanel) { + RecordPanel base = new RecordPanel(header, recordPanel); + LogSave.getInstance().saveLog("接收", base.toString()); recordKey = recordPanel.getKey(); recordFileName = recordPanel.getFilename(); - EventBus.getDefault().postSticky(new RecordPanel(header, recordPanel)); + EventBus.getDefault().postSticky(base); } @Override public void onGlobalPathResp(MessagePad.Header header, MessagePad.GlobalPathResp globalPathResp) { - EventBus.getDefault().postSticky(new GlobalPathResp(header, globalPathResp)); + GlobalPathResp base = new GlobalPathResp(header, globalPathResp); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onWarn(MessagePad.Header header, MessagePad.Warn warn) { - EventBus.getDefault().postSticky(new Warn(header, warn)); + Warn base = new Warn(header, warn); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onArrivalNotification(MessagePad.Header header, MessagePad.ArrivalNotification arrivalNotification) { - EventBus.getDefault().postSticky(new ArrivalNotification(header, arrivalNotification)); + ArrivalNotification base = new ArrivalNotification(header, arrivalNotification); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onUpgradeStateInfo(final IPCUpgradeStateInfo info) { + LogSave.getInstance().saveLog("接收", info.toString()); EventBus.getDefault().postSticky(info); } @@ -714,9 +753,9 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onClientStatusConnectChanged(int statusCode, String sign) { if (statusCode == ConnectState.STATUS_CONNECT_SUCCESS) { - connectStatus = com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTED; + connectStatus = IPC_CONNECTION_STATUS.CONNECTED; } else { - connectStatus = com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED; + connectStatus = IPC_CONNECTION_STATUS.DISCONNECTED; } runOnUiThread(new Runnable() { @Override @@ -822,11 +861,13 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onConnectionIPCStatus(int ipcConnectionStatus, String failedMsg) { connectStatus = ipcConnectionStatus; - onUpdateConnectStateView(); - if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTED) { + String status = onUpdateConnectStateView(); + status += "failedMsg=" + failedMsg; + LogSave.getInstance().saveLog("连接状态", status); + if (connectStatus == IPC_CONNECTION_STATUS.CONNECTED) { CupidLogUtils.w(TAG, "===>MainActivity onWebSocketConnectSuccess"); showIPCIP(AdasManager.getInstance().getIpcConnectedIp(), AdasManager.getInstance().getIpcConnectedPort()); - } else if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { + } else if (connectStatus == IPC_CONNECTION_STATUS.DISCONNECTED) { toastMsg("连接失败:" + failedMsg); CupidLogUtils.w(TAG, "===>MainActivity onWebSocketConnectFailed"); showIPCIP(AdasManager.getInstance().getIpcConnectedIp(), AdasManager.getInstance().getIpcConnectedPort()); @@ -889,8 +930,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onItemClick(int position, String data) { - CupidLogUtils.w(TAG, "TitleAdapter===>name:" + data); -// if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { +// if (connectStatus != IPC_CONNECTION_STATUS.CONNECTED) { // toastMsg("IPC 未连接"); // return; // } diff --git a/app_ipc_monitoring/src/main/res/layout/activity_main.xml b/app_ipc_monitoring/src/main/res/layout/activity_main.xml index fd6d4ce8fc..ad66fa0e54 100644 --- a/app_ipc_monitoring/src/main/res/layout/activity_main.xml +++ b/app_ipc_monitoring/src/main/res/layout/activity_main.xml @@ -4,6 +4,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F5F5F5" + android:focusable="true" + android:focusableInTouchMode="true" tools:context=".ui.MainActivity"> diff --git a/app_ipc_monitoring/src/main/res/layout/item_info.xml b/app_ipc_monitoring/src/main/res/layout/item_info.xml index dc4b1bcb42..517260aed3 100644 --- a/app_ipc_monitoring/src/main/res/layout/item_info.xml +++ b/app_ipc_monitoring/src/main/res/layout/item_info.xml @@ -1,10 +1,12 @@ + android:background="@drawable/item_bg" + android:gravity="center" + android:minHeight="50dp"> + android:textSize="16sp" /> \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/layout/item_info1.xml b/app_ipc_monitoring/src/main/res/layout/item_info1.xml new file mode 100644 index 0000000000..7d636cfa79 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/layout/item_info1.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/layout/item_main.xml b/app_ipc_monitoring/src/main/res/layout/item_main.xml index 778b6b83a0..20ab1227cb 100644 --- a/app_ipc_monitoring/src/main/res/layout/item_main.xml +++ b/app_ipc_monitoring/src/main/res/layout/item_main.xml @@ -56,145 +56,178 @@ android:textStyle="bold" android:visibility="gone" /> - - - - - + android:layout_marginStart="20dp" + android:layout_toEndOf="@id/local_ip" + android:layoutDirection="rtl"> - - - - - - - - - - - - - - + android:layout_height="match_parent"> - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From fd8cb723353cc64a8d48c36636cf46506d2081ec Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Fri, 1 Apr 2022 16:10:23 +0800 Subject: [PATCH 3/7] add obu log print --- config.gradle | 4 ++-- .../eagle/core/function/obu/mogo/MogoPrivateObuManager.kt | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/config.gradle b/config.gradle index fd6c3654d8..4965ab8c16 100644 --- a/config.gradle +++ b/config.gradle @@ -112,8 +112,8 @@ ext { // obu sdk obusdk : "com.zhidao.enterprise.smartv2x:smartv2x:1.0.0.3", - mogoobu : 'com.zhidao.support.obu:mogoobu:1.0.0.21', - mogoami : 'com.zhidao.support.obu.ami:mogoami:1.0.0.12', + mogoobu : 'com.zhidao.support.obu:mogoobu:1.0.0.22', + mogoami : 'com.zhidao.support.obu.ami:mogoami:1.0.0.13', adasHigh : 'com.zhidao.support.adas:high:1.2.1.2_bate25', // google diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt index da4e99e73d..b72a559f31 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt @@ -4,6 +4,8 @@ import android.content.Context import android.telecom.Call import android.util.Log import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.enums.WarningDirectionEnum @@ -52,6 +54,8 @@ class MogoPrivateObuManager private constructor() { .navigation(context) as IMogoServiceApis mContext = context connectObu(context, ipAddress) + //控制日志输出 + MogoObuManager.getInstance().init(MoGoAiCloudClientConfig.getInstance().getSn(), AppConfigInfo.toString()) MogoObuManager.getInstance().registerListener(mogoObuListener) } From 2db4622d3a27aac7c0bc12b7284eb5fe87f72290 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 1 Apr 2022 16:40:45 +0800 Subject: [PATCH 4/7] =?UTF-8?q?[fix]=E6=B5=8B=E8=AF=95=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_ipc_monitoring/src/main/res/layout/item_main.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app_ipc_monitoring/src/main/res/layout/item_main.xml b/app_ipc_monitoring/src/main/res/layout/item_main.xml index 20ab1227cb..6294e47e38 100644 --- a/app_ipc_monitoring/src/main/res/layout/item_main.xml +++ b/app_ipc_monitoring/src/main/res/layout/item_main.xml @@ -212,6 +212,7 @@ android:hint="IP地址" android:imeOptions="flagNoExtractUi" android:inputType="number" + android:layoutDirection="ltr" android:maxLength="21" android:maxLines="1" android:minWidth="100dp" From 0d8ecec8823950f3f76fb692f1ba39fcaac73b79 Mon Sep 17 00:00:00 2001 From: xuxinchao <13522809046@163.com> Date: Fri, 1 Apr 2022 17:29:06 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E8=B0=83=E8=AF=95=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 控制中心增加车辆状态模块,目前会展示方向盘转向角和档位信息 --- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 4 ++ .../adapter/MoGoHandAdasMsgManager.java | 21 ++++++- .../hmi/ui/setting/DebugSettingView.kt | 58 ++++++++++++++++++- .../main/res/layout/view_debug_setting.xml | 47 +++++++++++++++ .../IMoGoAutopilotVehicleStateListener.kt | 12 ++++ ...lerAutopilotVehicleStateListenerManager.kt | 24 ++++++++ 6 files changed, 162 insertions(+), 4 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index 713e611e82..3e49dc602d 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -152,6 +152,10 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerAutopilotVehicleStateListenerManager.invokeAutopilotLightSwitchData(vehicleState.light) //刹车灯数据 CallerAutopilotVehicleStateListenerManager.invokeAutopilotBrakeLightData(vehicleState.brakeLightStatus) + //方向盘转向角数据 + CallerAutopilotVehicleStateListenerManager.invokeAutopilotSteeringData(vehicleState.steering) + //挂挡档位数据 + CallerAutopilotVehicleStateListenerManager.invokeAutopilotGearData(vehicleState.gear) } } diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java index ae74990e6d..80566a0a9c 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java @@ -1,7 +1,5 @@ package com.mogo.eagle.core.function.autopilot.adapter; -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_DEVA; - import android.content.Context; import android.text.TextUtils; import android.util.Log; @@ -20,7 +18,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListen import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager; import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.ThreadUtils; import com.mogo.module.common.drawer.IdentifyDataDrawer; @@ -159,4 +156,22 @@ public class MoGoHandAdasMsgManager implements } } + /** + * 车辆方向盘转向角回调 + * @param steering 方向盘转向角 + */ + @Override + public void onAutopilotSteeringData(float steering) { + + } + + /** + * 车辆挂挡档位 + * @param gear 档位 + */ + @Override + public void onAutopilotGearData(@NotNull Chassis.GearPosition gear) { + + } + } \ 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/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index dd851b7762..a0ec0841fa 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -12,6 +12,7 @@ import androidx.annotation.RequiresApi import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager +import chassis.Chassis import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig @@ -77,7 +78,8 @@ class DebugSettingView @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoObuStatusListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarStateListener, IMoGoMapLocationListener, IMoGoAutopilotIdentifyListener, - IMoGoAutopilotPlanningListener, IMoGoAutopilotCarConfigListener { + IMoGoAutopilotPlanningListener, IMoGoAutopilotCarConfigListener + ,IMoGoAutopilotVehicleStateListener{ private val TAG = "DebugSettingView" @@ -170,6 +172,8 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotPlanningListenerManager.addListener(TAG, this) // 添加 工控机基础信息回调 监听 CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + //添加 车辆底盘数据回调 监听 + CallerAutopilotVehicleStateListenerManager.addListener(TAG,this) if (logInfoView != null) { logInfoView!!.onEnterForeground() } @@ -191,6 +195,11 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotIdentifyListenerManager.removeListener(TAG) // 移除 规划路径相关回调 监听 CallerAutopilotPlanningListenerManager.removeListener(TAG) + // 移除 工控机基础信息回调 监听 + CallerAutopilotCarConfigListenerManager.removeListener(TAG) + //移除 车辆底盘数据回调 监听 + CallerAutopilotVehicleStateListenerManager.removeListener(TAG) + if (logInfoView != null) { logInfoView!!.onEnterBackground() } @@ -318,6 +327,21 @@ class DebugSettingView @JvmOverloads constructor( } } + /** + * 车辆状态控制中心 + */ + tbVehicleStateController.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null, null, iconDown, null) + //展示车辆状态中心 + vehicleStateLayout.visibility = View.VISIBLE + } else { + buttonView.setCompoundDrawables(null, null, iconRight, null) + //隐藏车辆状态中心 + vehicleStateLayout.visibility = View.GONE + } + } + /** * HMI控制中心 */ @@ -1615,6 +1639,38 @@ class DebugSettingView @JvmOverloads constructor( tvObuDelay.text = "obu时延:" + delayTime.toString() } + /** + * 车辆转向灯 数据 + * @param lightSwitch + */ + override fun onAutopilotLightSwitchData(lightSwitch: Chassis.LightSwitch?) { + + } + + /** + * 车辆刹车灯 数据 + * @param brakeLight + */ + override fun onAutopilotBrakeLightData(brakeLight: Boolean) { + + } + + /** + * 车辆方向盘转向角回调 + * @param steering 方向盘转向角 + */ + override fun onAutopilotSteeringData(steering: Float) { + tvSteeringInfo.text = "方向盘转向角:${steering}" + } + + /** + * 车辆挂挡档位 + * @param gear 档位 + */ + override fun onAutopilotGearData(gear: Chassis.GearPosition) { + tvGearInfo.text = "挂挡档位:${gear}" + } + /** * 吐司提示 */ 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 5807b35fb9..e29a385e74 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 @@ -843,6 +843,53 @@ app:layout_constraintTop_toBottomOf="@id/obuDivider2" /> + + + + + + + + + + + + + + Date: Fri, 1 Apr 2022 17:46:50 +0800 Subject: [PATCH 6/7] =?UTF-8?q?[Bus/Taxi=20d=202.6.0]Bus/Taxi:=E5=9F=8B?= =?UTF-8?q?=E7=82=B9=E5=A2=9E=E5=8A=A0=E8=BD=A6=E7=89=8C=E3=80=81=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mogo/och/bus/constant/OchBusConst.kt | 2 ++ .../java/com/mogo/och/bus/util/OchBusAnalyticsUtil.java | 8 ++++++++ .../main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt | 2 ++ .../com/mogo/och/taxi/utils/OchTaxiAnalyticsUtil.java | 8 ++++++++ 4 files changed, 20 insertions(+) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt index ceb9969047..da4113702f 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt @@ -56,5 +56,7 @@ class OchBusConst { const val EVENT_PARAM_END_NAME = "end_name" const val EVENT_PARAM_LINE_ID = "line_id" const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false + const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号 + const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false } } \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/OchBusAnalyticsUtil.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/OchBusAnalyticsUtil.java index a2b88c8f2c..95f00222f2 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/OchBusAnalyticsUtil.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/OchBusAnalyticsUtil.java @@ -1,6 +1,10 @@ package com.mogo.och.bus.util; +import android.text.TextUtils; + import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.app.AppConfigInfo; import com.mogo.eagle.core.function.call.analytics.AnalyticsManager; import com.mogo.eagle.core.utilcode.util.DateTimeUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -25,11 +29,15 @@ public class OchBusAnalyticsUtil { boolean send, String startName, String endName, int lineId) { String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + String plateNum = AppConfigInfo.INSTANCE.getPlateNumber(); String dateTime = DateTimeUtils.getTimeText( System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss); Map params = new HashMap<>(); params.put(OchBusConst.EVENT_PARAM_SN, sn); + params.put(OchBusConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum); + params.put(OchBusConst.EVENT_PARAM_ENV_ONLINE, + DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false); params.put(OchBusConst.EVENT_PARAM_TIME, dateTime); params.put(OchBusConst.EVENT_PARAM_START_NAME, startName); params.put(OchBusConst.EVENT_PARAM_END_NAME, endName); diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt index 4cc818228d..7db638b41e 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt @@ -58,6 +58,8 @@ class OCHTaxiConst { const val EVENT_PARAM_END_NAME = "end_name" const val EVENT_PARAM_ORDER_NUMBER = "order_num" const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false + const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号 + const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false // 实时计算当前剩余里程和时间 间隔 2秒 const val LOOP_CALCULATEROUTE_2S = 2 * 1000L diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/OchTaxiAnalyticsUtil.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/OchTaxiAnalyticsUtil.java index a0f8b5b517..cc07f8f052 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/OchTaxiAnalyticsUtil.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/OchTaxiAnalyticsUtil.java @@ -1,6 +1,10 @@ package com.mogo.och.taxi.utils; +import android.text.TextUtils; + import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.app.AppConfigInfo; import com.mogo.eagle.core.function.call.analytics.AnalyticsManager; import com.mogo.eagle.core.utilcode.util.DateTimeUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -25,11 +29,15 @@ public class OchTaxiAnalyticsUtil { boolean send, String startName, String endName, String orderNo) { String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + String plateNum = AppConfigInfo.INSTANCE.getPlateNumber(); String dateTime = DateTimeUtils.getTimeText( System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss); Map params = new HashMap<>(); params.put(OCHTaxiConst.EVENT_PARAM_SN, sn); + params.put(OCHTaxiConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum); + params.put(OCHTaxiConst.EVENT_PARAM_ENV_ONLINE, + DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false); params.put(OCHTaxiConst.EVENT_PARAM_TIME, dateTime); params.put(OCHTaxiConst.EVENT_PARAM_START_NAME, startName); params.put(OCHTaxiConst.EVENT_PARAM_END_NAME, endName); From 0a094e47518e746920e37baa1fc834374e12aedd Mon Sep 17 00:00:00 2001 From: renwj Date: Fri, 1 Apr 2022 17:32:03 +0800 Subject: [PATCH 7/7] =?UTF-8?q?[Chat]=E8=BD=A6=E8=81=8A=E8=81=8A=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [Chat]车聊聊异常逻辑优化 --- .../chat/facade/media/MedialControlFacade.kt | 58 ++++++++++-------- .../chat/facade/ui/CallChatWindowManager.kt | 59 ++++++++++++++----- 2 files changed, 78 insertions(+), 39 deletions(-) diff --git a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/media/MedialControlFacade.kt b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/media/MedialControlFacade.kt index 0d09802484..99d04bc74c 100644 --- a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/media/MedialControlFacade.kt +++ b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/media/MedialControlFacade.kt @@ -17,36 +17,44 @@ internal object MedialControlFacade : IMoGoMediaFacade { } override fun play(context: Context, audioSources: Int, isLoop: Boolean, channel: Int) { - val player = player.get()?.get() ?: MediaPlayer().also { player.set(WeakReference(it)) } - resetStatus(player) - val file = context.resources.openRawResourceFd(audioSources) - player.apply { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - setAudioStreamType(channel) - } else { - setAudioAttributes(AudioAttributes.Builder().setLegacyStreamType(channel).build()) - } - setDataSource(file.fileDescriptor, file.startOffset, file.length) - file.close() - isLooping = isLoop - prepareAsync() - setOnPreparedListener { player -> - log(ChatConsts.TAG,"real play 准备播放音频====") - player.start() - } - setOnCompletionListener { player -> - log(ChatConsts.TAG,"播放完成====") - player.reset() + try { + val player = player.get()?.get() ?: MediaPlayer().also { player.set(WeakReference(it)) } + resetStatus(player) + val file = context.resources.openRawResourceFd(audioSources) + player.apply { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + setAudioStreamType(channel) + } else { + setAudioAttributes(AudioAttributes.Builder().setLegacyStreamType(channel).build()) + } + setDataSource(file.fileDescriptor, file.startOffset, file.length) + file.close() + isLooping = isLoop + prepareAsync() + setOnPreparedListener { player -> + log(ChatConsts.TAG,"real play 准备播放音频====") + player.start() + } + setOnCompletionListener { player -> + log(ChatConsts.TAG,"播放完成====") + player.reset() + } } + } catch (t: Throwable) { + log(ChatConsts.TAG, "播放铃声异常:$t") } } override fun release() { - val player = this.player.get()?.get() ?: return - log(ChatConsts.TAG,"release 释放音频播放====") - player.run { - resetStatus(this) - release() + try { + val player = this.player.get()?.get() ?: return + log(ChatConsts.TAG,"release 释放音频播放====") + player.run { + resetStatus(this) + release() + } + } catch (t: Throwable) { + log(ChatConsts.TAG, "释放MediaPlay异常: $t") } } diff --git a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/ui/CallChatWindowManager.kt b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/ui/CallChatWindowManager.kt index e1529b3690..02d8a353b6 100644 --- a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/ui/CallChatWindowManager.kt +++ b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/ui/CallChatWindowManager.kt @@ -69,6 +69,10 @@ internal class CallChatWindowManager { private var hasHangUpped = false + private var isInComingShow = false + private var isCallingShow = false + + @OptIn(ExperimentalCoroutinesApi::class) private var interrupt = Channel(RENDEZVOUS) @Synchronized @@ -141,10 +145,14 @@ internal class CallChatWindowManager { var refuse = incomingView.findViewById(R.id.module_carchatting_incoming_hangUp) val dismissJob = AtomicReference() var timer: Job? = null - var ring: Job? = null + var ring: Job? launch { - speak(REQUEST_CLOUD_VOICE_CALL) - calling() + try { + speak(REQUEST_CLOUD_VOICE_CALL) + calling() + } catch (t: Throwable) { + log(TAG, "来电呼叫异常:$t") + } }.also { ring = it } answer.onClick { timer = resetInComingTimer(timer, user, incomingView) @@ -160,10 +168,11 @@ internal class CallChatWindowManager { ToastUtils.showShort("正在处理, 请稍候...") return@onClick } - doRefuse(user) + doRefuse(user, inComingView = incomingView, isAnswerFail = false) } incomingView.observe(arrayOf(ON_CREATE, ON_DESTROY)) { itx -> if (itx == ON_CREATE) { + isInComingShow = true timer = inComingTimer(user, incomingView) launch(Dispatchers.Main) { val d1 = async { @@ -201,6 +210,7 @@ internal class CallChatWindowManager { }.also { dismissJob.set(it) } } if (itx == ON_DESTROY) { + isInComingShow = false ring?.safeCancel() timer?.safeCancel() hasAnswered = false @@ -263,7 +273,7 @@ internal class CallChatWindowManager { log(TAG, "延迟30s消失计时开始...") delay(DEFAULT_MAX_DIALING_TIME) log(TAG, "延迟30s消失计时结束...") - doRefuse(user, false) + doRefuse(user, false, incomingView, false) hide(incomingView) releaseAudioAndVoice() } @@ -300,9 +310,10 @@ internal class CallChatWindowManager { } doHangUp(user, callingView) } - callingView.observe(arrayOf(ON_CREATE, ON_DESTROY)) { + callingView.observe(arrayOf(ON_CREATE, ON_DESTROY)) { itx -> var job: Job? = null - if (it == ON_CREATE) { + if (itx == ON_CREATE) { + isCallingShow = true launch(Dispatchers.Main) { val d1 = async { log(ChatConsts.TAG, "等着新用户进来...") @@ -344,7 +355,8 @@ internal class CallChatWindowManager { facade.audioFocus().releaseAudioFocus() }.also { job = it } } - if (it == ON_DESTROY) { + if (itx == ON_DESTROY) { + isCallingShow = false job?.safeCancel() callerEnter.safeCancel() exitRoom.safeCancel() @@ -407,23 +419,29 @@ internal class CallChatWindowManager { } private fun onNewUserEnterRoom() { + if (!isCallingShow) { + return + } scope.launch { callerEnter.send(true) } } private fun onCallInterrupt() { + if (!isInComingShow) { + return + } scope.launch { interrupt.send(true) } } - private fun doAnswer(user: UserInfo, incommingView: View) { + private fun doAnswer(user: UserInfo, inComingView: View) { answer( user, onEnter = { releaseAudioAndVoice() - hide(incommingView) + hide(inComingView) showCallingView(user) }, onNewEnter = { @@ -442,9 +460,9 @@ internal class CallChatWindowManager { ToastUtils.showShort("应答失败") } } - doRefuse(user, false) + doRefuse(user, false, inComingView, true) releaseAudioAndVoice() - hide(incommingView) + hide(inComingView) facade.audioFocus().releaseAudioFocus() } ) @@ -489,7 +507,7 @@ internal class CallChatWindowManager { } } - private fun doRefuse(user: UserInfo, notify: Boolean = true) { + private fun doRefuse(user: UserInfo, notify: Boolean = true, inComingView: View, isAnswerFail: Boolean) { refuse(user, onSuccess = { if (notify) { @@ -499,7 +517,14 @@ internal class CallChatWindowManager { }, onError = { code, msg, extra -> log(TAG, "-- 拒绝失败 --: code:: $code; msg:: $msg; extra:: $extra") - ToastUtils.showShort("拒绝异常") + if (isAnswerFail) { + ToastUtils.showShort("应答异常") + } else { + ToastUtils.showShort("拒绝异常") + } + releaseAudioAndVoice() + hide(inComingView) + facade.audioFocus().releaseAudioFocus() }) } @@ -543,12 +568,18 @@ internal class CallChatWindowManager { } private fun exitRoom() { + if (!isCallingShow) { + return + } scope.launch { exitRoom.send(true) } } private fun onRefuseOK() { + if (!isInComingShow) { + return + } scope.launch { refused.send(true) }