diff --git a/core/function-impl/mogo-core-function-main/.gitignore b/OCH/mogo-och-bus-passenger/.gitignore similarity index 100% rename from core/function-impl/mogo-core-function-main/.gitignore rename to OCH/mogo-och-bus-passenger/.gitignore diff --git a/OCH/mogo-och-bus-passenger/build.gradle b/OCH/mogo-och-bus-passenger/build.gradle new file mode 100644 index 0000000000..b38804a63d --- /dev/null +++ b/OCH/mogo-och-bus-passenger/build.gradle @@ -0,0 +1,73 @@ +apply plugin: 'com.android.library' +apply plugin: 'com.alibaba.arouter' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + // buildToolsVersion rootProject.ext.android.buildToolsVersion + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode Integer.valueOf(VERSION_CODE) + versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") + + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + + javaCompileOptions { + annotationProcessorOptions { + arguments = [AROUTER_MODULE_NAME: project.getName()] + } + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + buildTypes { + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + debug { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation rootProject.ext.dependencies.kotlinstdlibjdk7 + implementation rootProject.ext.dependencies.androidxappcompat + implementation rootProject.ext.dependencies.arouter + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'com.google.android.material:material:1.2.1' + annotationProcessor rootProject.ext.dependencies.aroutercompiler + implementation rootProject.ext.dependencies.rxandroid + implementation rootProject.ext.dependencies.androidxconstraintlayout + implementation rootProject.ext.dependencies.amapnavi3dmap + if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { + implementation rootProject.ext.dependencies.mogoutils + implementation rootProject.ext.dependencies.mogocommons + implementation rootProject.ext.dependencies.modulecommon + implementation rootProject.ext.dependencies.mogo_core_data + implementation rootProject.ext.dependencies.mogo_core_function_call + implementation rootProject.ext.dependencies.mogo_core_function_v2x + }else { + implementation project(":core:mogo-core-utils") + implementation project(":foudations:mogo-commons") + implementation project(':modules:mogo-module-common') + implementation project(':core:mogo-core-data') + implementation project(':core:mogo-core-function-call') + implementation project(':core:function-impl:mogo-core-function-v2x') + } +} + +apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-main/consumer-rules.pro b/OCH/mogo-och-bus-passenger/consumer-rules.pro similarity index 100% rename from core/function-impl/mogo-core-function-main/consumer-rules.pro rename to OCH/mogo-och-bus-passenger/consumer-rules.pro diff --git a/OCH/mogo-och-bus-passenger/gradle.properties b/OCH/mogo-och-bus-passenger/gradle.properties new file mode 100644 index 0000000000..2ed1ed2f42 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/gradle.properties @@ -0,0 +1,3 @@ +GROUP=com.mogo.och +POM_ARTIFACT_ID=och-bus-passenger +VERSION_CODE=1 diff --git a/core/function-impl/mogo-core-function-main/proguard-rules.pro b/OCH/mogo-och-bus-passenger/proguard-rules.pro similarity index 100% rename from core/function-impl/mogo-core-function-main/proguard-rules.pro rename to OCH/mogo-och-bus-passenger/proguard-rules.pro diff --git a/OCH/mogo-och-bus-passenger/src/androidTest/java/com/mogo/och/bus/passenger/ExampleInstrumentedTest.java b/OCH/mogo-och-bus-passenger/src/androidTest/java/com/mogo/och/bus/passenger/ExampleInstrumentedTest.java new file mode 100644 index 0000000000..2685ade0a4 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/androidTest/java/com/mogo/och/bus/passenger/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.mogo.och.bus.passenger; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.mogo.och.bus.passenger.test", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/AndroidManifest.xml b/OCH/mogo-och-bus-passenger/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..e0687231c1 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/IMogoOCH.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/IMogoOCH.java new file mode 100644 index 0000000000..fb146e17c3 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/IMogoOCH.java @@ -0,0 +1,22 @@ +package com.mogo.och.bus.passenger; + +import androidx.annotation.IdRes; +import androidx.fragment.app.FragmentActivity; + +import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider; + +/** + * 网约车抽象接口 + * + * Created on 2022/3/29 + */ +interface IMogoOCH extends IMoGoFunctionProvider { + + /** + * 初始化网约车容器 + * + * @param activity + * @param containerId 容器ID + */ + void createCoverage(FragmentActivity activity, @IdRes int containerId); +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java new file mode 100644 index 0000000000..83725660cb --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java @@ -0,0 +1,89 @@ +package com.mogo.och.bus.passenger; + +import android.content.Context; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.elegant.utils.UiThreadHandler; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.map.MogoMapUIController; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.bus.passenger.constant.BusPassengerConst; +import com.mogo.service.statusmanager.IMogoStatusChangedListener; +import com.mogo.service.statusmanager.StatusDescriptor; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; + +/** + * 网约车-Bus-乘客端 + * + * Created on 2022/3/29 + */ +@Route(path = BusPassengerConst.PATH) +public class MogoOCHBusPassenger implements IMogoOCH, IMogoStatusChangedListener { + private static final String TAG = MogoOCHBusPassenger.class.getSimpleName(); + + private FragmentActivity mActivity; + private int mContainerId; + + @Override + public void createCoverage(FragmentActivity activity, int containerId) { + + } + + @Nullable + @Override + public Fragment createCoverage(@Nullable FragmentActivity activity, @Nullable Integer containerId) { + this.mActivity = activity; + this.mContainerId = containerId; + + UiThreadHandler.postDelayed(() -> stepIntoVrMode(), 5_000L); + return null; + } + + @NotNull + @Override + public String getFunctionName() { + return null; + } + + @Override + public void onDestroy() { + // 若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠 + if (mActivity == null) return; + mActivity.finish(); + } + + @Override + public void init(Context context) { + MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus" + , StatusDescriptor.VR_MODE, this); + MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus" + , StatusDescriptor.TOP_VIEW, this); + } + + @Override + public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) { + if (descriptor == StatusDescriptor.VR_MODE){ + if (isTrue){ + + }else { + + } + } + } + + /** + * 进入鹰眼模式,设置手势缩放地图失效 + */ + private void stepIntoVrMode() { + CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "进入vr模式" ); + MogoMapUIController.getInstance() + .openVrMode( false ); + } +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/constant/BusPassengerConst.kt b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/constant/BusPassengerConst.kt new file mode 100644 index 0000000000..b3515af9ba --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/constant/BusPassengerConst.kt @@ -0,0 +1,28 @@ +package com.mogo.och.bus.passenger.constant + +import com.mogo.commons.debug.DebugConfig + +/** + * Created on 2021/12/6 + */ +class BusPassengerConst { + companion object { + + private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com" + private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com" + private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com" + + @JvmStatic + fun getBaseUrl(): String { + return when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV + DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA + DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE + else -> BASE_URL_OCH_RELEASE + } + } + + // OCH arouter 路由path + const val PATH = "/och/api" + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java b/OCH/mogo-och-bus-passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java new file mode 100644 index 0000000000..a0652d588f --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.mogo.och.bus.passenger; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java similarity index 95% rename from OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java rename to OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java index cb96b48ac4..5675c85b9c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java @@ -25,12 +25,12 @@ public * @author congtaowang * @since 2021/1/15 *

- * 网约车-出租车 + * 网约车-出租车-乘客端 */ @Route( path = TaxiPassengerConst.PATH ) -class MogoOCHTaxi implements IMogoOCH, IMogoStatusChangedListener { +class MogoOCHTaxiPassenger implements IMogoOCH, IMogoStatusChangedListener { - private static final String TAG = "MogoOCHTaxi"; + private static final String TAG = "MogoOCHTaxiPassenger"; private TaxiPassengerBaseFragment ochTaxiPassengerFragment; private FragmentActivity mActivity; private int mContainerId; diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java deleted file mode 100644 index ed9e0bc0f7..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.mogo.och.taxi.passenger; - -import android.content.Context; - -import com.mogo.eagle.core.data.map.MogoLatLng; -import com.mogo.eagle.core.data.map.MogoLocation; -import com.mogo.eagle.core.function.v2x.events.utils.LocationUtils; -import com.mogo.eagle.core.utilcode.util.ColorUtils; -import com.mogo.map.MogoOverlayManager; -import com.mogo.map.overlay.IMogoOverlayManager; -import com.mogo.map.overlay.IMogoPolyline; -import com.mogo.map.overlay.MogoPolylineOptions; -import com.mogo.module.common.MogoApisHandler; -import java.util.ArrayList; -import java.util.List; - -public class OCHTaxiOverlayManager { - - - private IMogoPolyline mMoGoPolyline; - // 连接线参数 - private MogoPolylineOptions mPolylineOptions; - // 线路径集合 - private List mPolylinePointList; - // 渐变色 - private List mPolylineColors; - private Context mContext; - IMogoOverlayManager mogoOverlayManager; - public OCHTaxiOverlayManager(Context context) { - mPolylineOptions = new MogoPolylineOptions(); - // 绘制路径集合 - mPolylinePointList = new ArrayList<>(); - // 引导线颜色 - mPolylineColors = new ArrayList<>(); - mContext = context; - mogoOverlayManager = MogoOverlayManager.getInstance(); - } - - /** - * 绘制最优路线 - * - * @param polylinePoint 要绘制的经纬度度集合 - */ - public IMogoPolyline draw(MogoLocation carLocal, List polylinePoint) { - if (mMoGoPolyline != null) { - mMoGoPolyline.remove(); - mPolylinePointList.clear(); - mPolylineColors.clear(); - } - if (polylinePoint != null) { - - // 将当前车辆位置放进去 - mPolylinePointList.add(new MogoLatLng(carLocal.getLatitude(), carLocal.getLongitude())); - // 过滤后台推送的推荐路线集合 - for (MogoLatLng polyline : polylinePoint) { - //需要剔除已经行驶过的经纬度,这里需要比对推荐路线集合中的点是否在当前车辆行驶方向前面如果不在则抛弃 - if (LocationUtils.isPointOnCarFront(carLocal, polyline)) { - mPolylinePointList.add(polyline); - } - } - mPolylineColors.addAll(ColorUtils.getGradientAlpha("#002965ED", "#FF2965ED", "#002965ED", mPolylinePointList.size())); - // 替换路径集合 - mPolylineOptions.points(mPolylinePointList); - // 线条粗细,渐变,渐变色值 - mPolylineOptions.width(25).useGradient(true).colorValues(mPolylineColors); - // 绘制线 - mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions); - } - return mMoGoPolyline; - } - -} diff --git a/app/build.gradle b/app/build.gradle index 66a4af0052..68f2bc1df2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -237,18 +237,18 @@ dependencies { releaseImplementation rootProject.ext.dependencies.releaseleakcanary if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { - implementation rootProject.ext.dependencies.mogo_core_function_main implementation rootProject.ext.dependencies.ttspad + implementation rootProject.ext.dependencies.mogo_core_function_hmi + androidTestImplementation rootProject.ext.dependencies.mogo_core_function_call androidTestImplementation rootProject.ext.dependencies.mogo_core_res - androidTestImplementation rootProject.ext.dependencies.mogo_core_function_hmi androidTestImplementation rootProject.ext.dependencies.mogo_core_function_notice } else { - implementation project(':core:function-impl:mogo-core-function-main') implementation project(':tts:tts-pad') + implementation project(':core:function-impl:mogo-core-function-hmi') + androidTestImplementation project(':core:mogo-core-function-call') androidTestImplementation project(':core:mogo-core-res') - androidTestImplementation project(':core:function-impl:mogo-core-function-hmi') androidTestImplementation project(':core:function-impl:mogo-core-function-notice') } diff --git a/app/functions/och.gradle b/app/functions/och.gradle index 301d25a9cf..fa05f78b8f 100644 --- a/app/functions/och.gradle +++ b/app/functions/och.gradle @@ -61,7 +61,7 @@ project.dependencies { } // Bus乘客端 - fPadLenovoOchBusPassengerImplementation (project(':OCH:mogo-och-bus')) { + fPadLenovoOchBusPassengerImplementation (project(':OCH:mogo-och-bus-passenger')) { exclude group: 'com.mogo.commons' //by group exclude group: 'com.mogo.module' //by group exclude group: 'com.mogo.map' //by group diff --git a/app/productFlavors/fPadLenovoOchBusPassenger.gradle b/app/productFlavors/fPadLenovoOchBusPassenger.gradle index 74487113d3..963ba6b66b 100644 --- a/app/productFlavors/fPadLenovoOchBusPassenger.gradle +++ b/app/productFlavors/fPadLenovoOchBusPassenger.gradle @@ -26,8 +26,8 @@ project.android.productFlavors { // GPS数据提供源: 0-Android系统,1-工控机,2-OBU buildConfigField 'int', 'GPS_PROVIDER', "1" - // 构建的应用身份类型,出租车0|小巴A-司机0|乘客1 - buildConfigField 'int', 'APP_IDENTITY_MODE', "0xA1" + // 构建的应用身份类型,出租车0|小巴A-司机0|乘客1 (注:20220330 bus passengerv1.0.0实际是做为车上单屏司机端使用) + buildConfigField 'int', 'APP_IDENTITY_MODE', "0xA0" // 连接的工控机IP地址 buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.8.103\"" // 构建的是否是演示(美化)模式 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7528c86e94..7d31d4c005 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,9 +13,9 @@ android:label="@string/app_shell_name" android:largeHeap="true" android:resizeableActivity="false" - android:usesCleartextTraffic="true" android:supportsRtl="true" - android:theme="@style/Main" + android:theme="@style/AppTheme.App" + android:usesCleartextTraffic="true" tools:replace="android:label"> @@ -36,7 +36,6 @@ android:value="${MAP_SDK_VERSION}" /> - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7e091a2301..fff387fdb3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,4 +5,6 @@ #D81B60 + #1C1C1C + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index cc42d0d0c2..55f99fed29 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,12 +1,32 @@ - - + diff --git a/app_ipc_monitoring/build.gradle b/app_ipc_monitoring/build.gradle index e688cb6413..e9e83e92b6 100644 --- a/app_ipc_monitoring/build.gradle +++ b/app_ipc_monitoring/build.gradle @@ -1,12 +1,11 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" + compileSdkVersion 31 defaultConfig { applicationId "com.zhidao.adas.client" - minSdkVersion 19 - targetSdkVersion 22 + minSdkVersion 21 + targetSdkVersion 31 multiDexEnabled true versionCode 1 versionName "1.0" diff --git a/app_ipc_monitoring/src/main/AndroidManifest.xml b/app_ipc_monitoring/src/main/AndroidManifest.xml index 5da8d114a8..7b879c95e6 100644 --- a/app_ipc_monitoring/src/main/AndroidManifest.xml +++ b/app_ipc_monitoring/src/main/AndroidManifest.xml @@ -39,7 +39,7 @@ android:theme="@style/AppTheme"> @@ -49,7 +49,9 @@ - + diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/AutopilotConfigAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/AutopilotConfigAdapter.java new file mode 100644 index 0000000000..a5f2db2681 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/AutopilotConfigAdapter.java @@ -0,0 +1,405 @@ +package com.zhidao.adas.client.adapter; + +import android.content.Context; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.bean.AutoPilotMode; + +import java.util.ArrayList; +import java.util.List; + +public class AutopilotConfigAdapter extends RecyclerView.Adapter { + + private List datas; + private Context mContext; + private OnHaveDataListener onHaveDataListener; + private boolean isShowDel = false; + + public AutopilotConfigAdapter(List datas) { + this.datas = datas; + if (datas == null) { + this.datas = new ArrayList<>(); + } + } + + public void setShowDel(boolean showDel) { + isShowDel = showDel; + notifyDataSetChanged(); + } + + public List getDatas() { + return datas; + } + + public interface OnHaveDataListener { + void onHaveData(boolean isHave); + } + + public void setOnItemClickListener(OnHaveDataListener l) { + this.onHaveDataListener = l; + } + + public void add() { + datas.add(new AutoPilotMode()); + notifyItemInserted(datas.size() - 1); + if (onHaveDataListener != null && datas.size() == 1) + onHaveDataListener.onHaveData(true); + } + + public void minus(int position) { + AutoPilotMode bean = datas.get(position); + bean.wayLatLons = null; + bean = null; + datas.remove(position); + notifyItemRemoved(position); + notifyItemRangeChanged(position, getItemCount()); + if (onHaveDataListener != null && datas.size() == 0) + onHaveDataListener.onHaveData(false); + } + + @Override + public int getItemViewType(int position) { + return position; + } + + //创建ViewHolder + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //实例化得到Item布局文件的View对象 + mContext = parent.getContext(); + View v = LayoutInflater.from(mContext).inflate(R.layout.item_autopilot_config, parent, false); + //返回MyViewHolder的对象 + return new MyViewHolder(v); + } + + //绑定数据 + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + AutoPilotMode mode = datas.get(position); + if (!TextUtils.isEmpty(mode.name)) + holder.path_name.setText(mode.name); + if (mode.speedLimit != 0.0) + holder.speed.setText(String.valueOf(mode.speedLimit)); + if (!TextUtils.isEmpty(mode.startName)) + holder.start_name.setText(mode.startName); + if (!TextUtils.isEmpty(mode.endName)) + holder.end_name.setText(mode.endName); + if (mode.startLatLon != null) { + if (mode.startLatLon.longitude != 0.0) + holder.start_lon.setText(String.valueOf(mode.startLatLon.longitude)); + if (mode.startLatLon.latitude != 0.0) + holder.start_lat.setText(String.valueOf(mode.startLatLon.latitude)); + } + if (mode.endLatLon != null) { + if (mode.endLatLon.longitude != 0.0) + holder.end_lon.setText(String.valueOf(mode.endLatLon.longitude)); + if (mode.endLatLon.latitude != 0.0) + holder.end_lat.setText(String.valueOf(mode.endLatLon.latitude)); + } + holder.setViaData(); + holder.del.setVisibility(isShowDel ? View.VISIBLE : View.GONE); + } + + //返回Item的数量 + @Override + public int getItemCount() { + return datas == null ? 0 : datas.size(); + } + + //继承RecyclerView.ViewHolder抽象类的自定义ViewHolder + class MyViewHolder extends RecyclerView.ViewHolder { + RecyclerView recyclerView; + EditText path_name; + EditText speed; + EditText start_name; + EditText end_name; + EditText start_lon; + EditText start_lat; + EditText end_lon; + EditText end_lat; + TextView num; + TextView del; + ImageView add; + ImageView minus; + ViaPositionAdapter adapter; + + MyViewHolder(View itemView) { + super(itemView); + recyclerView = itemView.findViewById(R.id.RecyclerView); + path_name = itemView.findViewById(R.id.path_name); + speed = itemView.findViewById(R.id.speed); + start_name = itemView.findViewById(R.id.start_name); + end_name = itemView.findViewById(R.id.end_name); + start_lon = itemView.findViewById(R.id.start_lon); + start_lat = itemView.findViewById(R.id.start_lat); + end_lon = itemView.findViewById(R.id.end_lon); + end_lat = itemView.findViewById(R.id.end_lat); + num = itemView.findViewById(R.id.num); + del = itemView.findViewById(R.id.del); + add = itemView.findViewById(R.id.add); + minus = itemView.findViewById(R.id.minus); + initRecyclerView(); + minus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + minus(); + } + }); + add.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + add(); + } + }); + del.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AutopilotConfigAdapter.this.minus(getBindingAdapterPosition()); + } + }); + path_name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + datas.get(getBindingAdapterPosition()).name = s.toString().trim(); + } + }); + speed.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + datas.get(getBindingAdapterPosition()).speedLimit = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + speed.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + datas.get(getBindingAdapterPosition()).speedLimit = 0.0; + } + + } + }); + start_name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + datas.get(getBindingAdapterPosition()).startName = s.toString().trim(); + } + }); + end_name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + datas.get(getBindingAdapterPosition()).endName = s.toString().trim(); + } + }); + start_lon.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + if (datas.get(getBindingAdapterPosition()).startLatLon == null) + datas.get(getBindingAdapterPosition()).startLatLon = new AutoPilotMode.Location(); + datas.get(getBindingAdapterPosition()).startLatLon.longitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + start_lon.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + if (datas.get(getBindingAdapterPosition()).startLatLon != null) { + datas.get(getBindingAdapterPosition()).startLatLon.longitude = 0.0; + } + } + } + }); + start_lat.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + if (datas.get(getBindingAdapterPosition()).startLatLon == null) + datas.get(getBindingAdapterPosition()).startLatLon = new AutoPilotMode.Location(); + datas.get(getBindingAdapterPosition()).startLatLon.latitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + start_lat.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + if (datas.get(getBindingAdapterPosition()).startLatLon != null) + datas.get(getBindingAdapterPosition()).startLatLon.latitude = 0.0; + } + } + }); + end_lon.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + if (datas.get(getBindingAdapterPosition()).endLatLon == null) + datas.get(getBindingAdapterPosition()).endLatLon = new AutoPilotMode.Location(); + datas.get(getBindingAdapterPosition()).endLatLon.longitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + end_lon.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + if (datas.get(getBindingAdapterPosition()).endLatLon != null) + datas.get(getBindingAdapterPosition()).endLatLon.longitude = 0.0; + } + + } + }); + end_lat.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + if (datas.get(getBindingAdapterPosition()).endLatLon == null) + datas.get(getBindingAdapterPosition()).endLatLon = new AutoPilotMode.Location(); + datas.get(getBindingAdapterPosition()).endLatLon.latitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + end_lat.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + if (datas.get(getBindingAdapterPosition()).endLatLon != null) + datas.get(getBindingAdapterPosition()).endLatLon.latitude = 0.0; + } + + } + }); + } + + private void initRecyclerView() { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerView.setLayoutManager(linearLayoutManager); + adapter = new ViaPositionAdapter(); + recyclerView.setAdapter(adapter); + + } + + private void minus() { + if (adapter.getItemCount() > 0) { + adapter.minus(); + num.setText(String.valueOf(adapter.getItemCount())); + } + } + + public void add() { + adapter.addHint(); + recyclerView.scrollToPosition(adapter.getItemCount() - 1); + num.setText(String.valueOf(adapter.getItemCount())); + } + + public void setViaData() { + if (adapter.getDatas() == null) { + List list = datas.get(getBindingAdapterPosition()).wayLatLons; + if (list == null) { + list = new ArrayList<>(); + datas.get(getBindingAdapterPosition()).wayLatLons = list; + } + adapter.setDatas(list); + } + } + } +} + diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java similarity index 97% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java index 88dd8b7c35..7381bc5116 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.adapter; import android.view.LayoutInflater; import android.view.View; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/DataShowAdapter.java similarity index 98% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/DataShowAdapter.java index b268d58d1b..1ef3a2366e 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/DataShowAdapter.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.adapter; import android.annotation.SuppressLint; import android.graphics.Color; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java similarity index 97% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java index 136277a6d6..354abc0b1d 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.adapter; import android.view.LayoutInflater; import android.view.View; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/LineAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/LineAdapter.java new file mode 100644 index 0000000000..657746c36a --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/LineAdapter.java @@ -0,0 +1,60 @@ +package com.zhidao.adas.client.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.base.BaseViewHolder; +import com.zhidao.adas.client.bean.AutoPilotMode; + +import java.util.List; + +/** + * @author song kenan + * @des 线路 + * @date 2021/8/13 + */ +public class LineAdapter extends BaseAdapter { + + + public LineAdapter(List data) { + super(data); + } + + @Override + public void setData(List mDatas) { + super.setData(mDatas); + } + + @Override + protected void onBindDataToItem(ViewHolder viewHolder, AutoPilotMode data, int position) { + viewHolder.title.setText(data.name + " " + data.startName + "->" + data.endName); + } + + @Override + protected View getItemViewResource(ViewGroup viewGroup) { + return LayoutInflater.from(mContext).inflate(R.layout.item_info, viewGroup, false); + } + + @Override + protected ViewHolder getViewHolder(View view) { + return new ViewHolder(view, this); + } + + class ViewHolder extends BaseViewHolder { + TextView title; + + public ViewHolder(View itemView, LineAdapter adapter) { + super(itemView, adapter); + ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams(); + if (layoutParams != null) { + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + + } + title = itemView.findViewById(R.id.tv_info_title); + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ViaPositionAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ViaPositionAdapter.java new file mode 100644 index 0000000000..10fea989e6 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ViaPositionAdapter.java @@ -0,0 +1,157 @@ +package com.zhidao.adas.client.adapter; + +import android.content.Context; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.bean.AutoPilotMode; + +import java.util.List; + + +public class ViaPositionAdapter extends RecyclerView.Adapter { + + private List datas; + private Context mContext; + + public void setDatas(List datas) { + this.datas = datas; + if (!this.datas.isEmpty()) { + for (int i = 0; i < this.datas.size(); i++) { + this.datas.get(i).name = "点" + (i + 1); + } + } + } + + public List getDatas() { + return datas; + } + + public void addHint() { + datas.add(new AutoPilotMode.Location("点" + (datas.size() + 1))); + notifyItemInserted(datas.size() - 1); + } + + public void minus() { + datas.remove(datas.size() - 1); + notifyItemRemoved(datas.size() - 1); + notifyItemRangeChanged(datas.size() - 1, getItemCount()); + } + + @Override + public int getItemViewType(int position) { + return position; + } + + //创建ViewHolder + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //实例化得到Item布局文件的View对象 + mContext = parent.getContext(); + View v = LayoutInflater.from(mContext).inflate(R.layout.item_via, parent, false); + //返回MyViewHolder的对象 + return new MyViewHolder(v); + } + + //绑定数据 + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + AutoPilotMode.Location location = datas.get(position); + holder.title.setText(location.name); + if (location.longitude != 0.0) + holder.lon.setText(String.valueOf(location.longitude)); + if (location.latitude != 0.0) + holder.lat.setText(String.valueOf(location.latitude)); +// holder.input.setFocusable(true); +// holder.input.setFocusableInTouchMode(true); +// holder.input.requestFocus(); + + } + + //返回Item的数量 + @Override + public int getItemCount() { + return datas == null ? 0 : datas.size(); + } + + + //继承RecyclerView.ViewHolder抽象类的自定义ViewHolder + class MyViewHolder extends RecyclerView.ViewHolder { + TextView title; + EditText lon; + EditText lat; + + MyViewHolder(View itemView) { + super(itemView); + title = itemView.findViewById(R.id.title); + lon = itemView.findViewById(R.id.lon); + lat = itemView.findViewById(R.id.lat); + lon.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + datas.get(getBindingAdapterPosition()).longitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + lon.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + datas.get(getBindingAdapterPosition()).longitude = 0.0; + } + } + }); + lat.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + datas.get(getBindingAdapterPosition()).latitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + lat.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + datas.get(getBindingAdapterPosition()).latitude = 0.0; + } + } + }); + } + } + +} + diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java new file mode 100644 index 0000000000..65e64c103e --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java @@ -0,0 +1,75 @@ +package com.zhidao.adas.client.base; + +import android.os.Handler; +import android.os.Message; + +import androidx.appcompat.app.AppCompatActivity; + +import java.lang.ref.WeakReference; + +public abstract class BaseActivity extends AppCompatActivity { + 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) { + + } + + /** + * 同Handler的postRunnable + * 在此之前确定已经调用initHandler() + */ + protected void postRunnable(Runnable runnable) { + postRunnableDelayed(runnable, 0); + } + + /** + * 同Handler的postRunnableDelayed + * 在此之前确定已经调用initHandler() + */ + protected void postRunnableDelayed(Runnable runnable, long delayMillis) { + if (mBaseHandler == null) initHandler(); + mBaseHandler.postDelayed(runnable, delayMillis); + } + + + protected static class BaseHandler extends Handler { + private final WeakReference mObjects; + + public BaseHandler(BaseActivity mPresenter) { + mObjects = new WeakReference(mPresenter); + } + + @Override + public void handleMessage(Message msg) { + BaseActivity mPresenter = mObjects.get(); + if (mPresenter != null) + mPresenter.handleMessage(msg); + } + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutoPilotMode.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutoPilotMode.java new file mode 100644 index 0000000000..6eff67cbed --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutoPilotMode.java @@ -0,0 +1,59 @@ +package com.zhidao.adas.client.bean; + +import android.text.TextUtils; + +import java.util.ArrayList; +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +public class AutoPilotMode { + public String name; + public String startName; + public Location startLatLon; + public String endName; + public Location endLatLon; + public double speedLimit; + public List wayLatLons; + + public List getWayLatLons() { + if (wayLatLons == null || wayLatLons.isEmpty()) return null; + List list = new ArrayList<>(); + for (int i = 0; i < wayLatLons.size(); i++) { + MessagePad.Location.Builder builder = MessagePad.Location.newBuilder(); + builder.setLatitude(wayLatLons.get(i).latitude).setLongitude(wayLatLons.get(i).longitude); + list.add(builder.build()); + } + return list; + } + + public static class Location { + public String name; + public double longitude; + public double latitude; + + public Location() { + } + + public Location(String name) { + this.name = name; + } + + public boolean isNull() { + return longitude == 0.0 || latitude == 0.0; + } + } + + public boolean isNull() { + if (wayLatLons != null && !wayLatLons.isEmpty()) { + for (int i = 0; i < wayLatLons.size(); i++) { + if (wayLatLons.get(i).isNull()) { + return true; + } + } + } + return TextUtils.isEmpty(name) || TextUtils.isEmpty(startName) || TextUtils.isEmpty(endName) || + startLatLon == null || startLatLon.isNull() || endLatLon == null || endLatLon.isNull() || + speedLimit == 0.0; + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PerceptionTrafficLight.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PerceptionTrafficLight.java new file mode 100644 index 0000000000..5b50580c61 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PerceptionTrafficLight.java @@ -0,0 +1,22 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; +import perception.TrafficLightOuterClass; + +public class PerceptionTrafficLight extends Base { + public final TrafficLightOuterClass.TrafficLights bean; + + public PerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights bean) { + super(bean.getSerializedSize(), header); + 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/UpdateDataEvent.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/UpdateDataEvent.java new file mode 100644 index 0000000000..9bc49dac5f --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/UpdateDataEvent.java @@ -0,0 +1,4 @@ +package com.zhidao.adas.client.bean; + +public class UpdateDataEvent { +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutoPilotModeDialog.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutoPilotModeDialog.java new file mode 100644 index 0000000000..bdd5149aa4 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutoPilotModeDialog.java @@ -0,0 +1,141 @@ +package com.zhidao.adas.client.ui; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.LineAdapter; +import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.bean.UpdateDataEvent; +import com.zhidao.adas.client.bean.AutoPilotMode; +import com.zhidao.adas.client.utils.Constants; +import com.zhidao.support.adas.high.AdasManager; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +import mogo.telematics.pad.MessagePad; + + +public class AutoPilotModeDialog extends Dialog { + private RecyclerView recyclerView; + private LineAdapter adapter; + private List list; + + public AutoPilotModeDialog(@NonNull Context context) { + super(context, R.style.CustomDialog); + + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_autopilot_mode); + //初始化界面控件 + initView(); + list = Constants.getPaths(getContext()); + initBtnRecyclerView(); + //初始化界面控件的事件 + initListener(); + setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + EventBus.getDefault().unregister(AutoPilotModeDialog.this); + } + }); + + } + + @Override + public void show() { + super.show(); + EventBus.getDefault().register(AutoPilotModeDialog.this); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onUpdateDataEvent(UpdateDataEvent event) { + list = Constants.getPaths(getContext()); + if (adapter != null) { + adapter.setData(list); + } + } + + private void initBtnRecyclerView() { + //初始info-recycle + LinearLayoutManager nodLinearLayoutManage = new LinearLayoutManager(getContext()); + nodLinearLayoutManage.setOrientation(LinearLayoutManager.VERTICAL); + recyclerView.setLayoutManager(nodLinearLayoutManage); + //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 + recyclerView.setHasFixedSize(true); + //解决局部刷新闪屏问题 + SimpleItemAnimator animatorInfo = (SimpleItemAnimator) recyclerView.getItemAnimator(); + if (animatorInfo != null) + animatorInfo.setSupportsChangeAnimations(false); + //创建并设置Adapter + adapter = new LineAdapter(list); + recyclerView.setAdapter(adapter); + adapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() { + @Override + public void onItemClick(int position, AutoPilotMode data) { + MessagePad.Location startLocation = MessagePad.Location.newBuilder() + .setLatitude(data.startLatLon.latitude) + .setLongitude(data.startLatLon.longitude) + .build(); + MessagePad.Location endLocation = MessagePad.Location.newBuilder() + .setLatitude(data.endLatLon.latitude) + .setLongitude(data.endLatLon.longitude) + .build(); + MessagePad.RouteInfo.Builder builder = MessagePad.RouteInfo.newBuilder(); + builder.setStartLocation(startLocation); + builder.setStartName(data.startName); + builder.setEndLocation(endLocation); + builder.setEndName(data.endName); + List list = data.getWayLatLons(); + if (list != null) + builder.addAllWayPoints(list); + builder.setSpeedLimit(data.speedLimit); + builder.setVehicleType(9); + builder.setIsSpeakVoice(true); + AdasManager.getInstance().sendAutoPilotModeReq(1, 0, builder.build()); + AutoPilotModeDialog.this.dismiss(); + } + }); + } + + /** + * 初始化界面的确定和取消监听器 + */ + private void initListener() { + findViewById(R.id.settings).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getContext().startActivity(new Intent(getContext(), AutopilotConfigActivity.class)); + } + }); + } + + + /** + * 初始化界面控件 + */ + private void initView() { + recyclerView = findViewById(R.id.recyclerView); + + + } + + +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java new file mode 100644 index 0000000000..8ef6124f3c --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java @@ -0,0 +1,312 @@ +package com.zhidao.adas.client.ui; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Message; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.AutopilotConfigAdapter; +import com.zhidao.adas.client.base.BaseActivity; +import com.zhidao.adas.client.bean.UpdateDataEvent; +import com.zhidao.adas.client.bean.AutoPilotMode; +import com.zhidao.adas.client.bean.GnssInfo; +import com.zhidao.adas.client.utils.Constants; +import com.zhidao.support.adas.high.common.ThreadPoolManager; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + + +public class AutopilotConfigActivity extends BaseActivity { + private static final String TAG = "CreateActivity"; + private TextView toolbar_title; + private RecyclerView recyclerView; + private AutopilotConfigAdapter autopilotConfigAdapter; + private GridLayoutManager linearLayoutManager; + + private static final int WHAT_START = 0; + TextView no_date; + private TextView lonText; + private TextView latText; + private double lon = -1; + private double lat = -1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_autopilot_cloud_config); + Toolbar toolbar = findViewById(R.id.toolbar); + recyclerView = findViewById(R.id.recyclerView); + no_date = findViewById(R.id.no_date); + setSupportActionBar(toolbar); + getSupportActionBar().setTitle(""); + toolbar_title = findViewById(R.id.toolbar_title); + toolbar_title.setText("创建线路"); + getSupportActionBar().setDisplayHomeAsUpEnabled(true);//左侧添加一个默认的返回图标 + getSupportActionBar().setHomeButtonEnabled(true); //设置返回键可用 + initHandler(); + EventBus.getDefault().register(this); + initRecyclerView(); + toolbar_title.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + Toast.makeText(AutopilotConfigActivity.this, "恭喜解锁隐藏技能", Toast.LENGTH_LONG).show(); + return true; + } + }); + + } + + @Override + protected void onResume() { + super.onResume(); + init(); + } + + private void init() { + if (autopilotConfigAdapter.getItemCount() == 0) { + recyclerView.setVisibility(View.GONE); + no_date.setVisibility(View.VISIBLE); + } else { + no_date.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + } + + } + + private void initRecyclerView() { + linearLayoutManager = new GridLayoutManager(this, 2); + linearLayoutManager.setOrientation(GridLayoutManager.VERTICAL); + recyclerView.setLayoutManager(linearLayoutManager); + //添加Android自带的分割线 + recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); + recyclerView.addItemDecoration(new HorizontalDividerItemDecoration(this)); + autopilotConfigAdapter = new AutopilotConfigAdapter(Constants.getPaths(this)); + recyclerView.setAdapter(autopilotConfigAdapter); + autopilotConfigAdapter.setOnItemClickListener(new AutopilotConfigAdapter.OnHaveDataListener() { + @Override + public void onHaveData(boolean isHave) { + if (isHave) { + no_date.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + } else { + recyclerView.setVisibility(View.GONE); + no_date.setVisibility(View.VISIBLE); + + } + } + }); + } + + + public void onSave() { + List list = autopilotConfigAdapter.getDatas(); + if (list == null || list.isEmpty()) { + Toast.makeText(AutopilotConfigActivity.this, "未找到可用数据,无法保存", Toast.LENGTH_SHORT).show(); + return; + } + Toast.makeText(AutopilotConfigActivity.this, "正在保存...", Toast.LENGTH_SHORT).show(); + Runnable runnable = new Runnable() { + @Override + public void run() { + boolean isNull = false; + for (int i = 0; i < list.size(); i++) { + if (list.get(i).isNull()) { + isNull = true; + break; + } + } + if (!isNull) { + Constants.setPath(AutopilotConfigActivity.this, list); + } + Message msg = Message.obtain(); + msg.what = WHAT_START; + msg.obj = !isNull; + + getHandler().sendMessage(msg); + } + }; + ThreadPoolManager.getsInstance().execute(runnable); + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + EventBus.getDefault().post(new UpdateDataEvent()); + if (getHandler() != null) + getHandler().removeCallbacksAndMessages(null); + EventBus.getDefault().unregister(this); + } + + @Override + protected void handleMessage(Message msg) { + super.handleMessage(msg); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + switch (msg.what) { + case WHAT_START: + if ((Boolean) msg.obj) { + builder.setTitle("保存成功") + .setMessage("配置保存成功啦") + .setNegativeButton("退出", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }) + .setPositiveButton("确定", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + } + }); + } else { + builder.setTitle("保存失败") + .setMessage("请输入必填项\n所有输入框均必填\uD83E\uDD2A") + .setPositiveButton("确认", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + } + }); + } + break; + + } + AlertDialog dialog = builder.show(); +// dialog.setCancelable(false); +// dialog.setCanceledOnTouchOutside(false); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_create, menu); + MenuItem itemDel = menu.findItem(R.id.action_del_item); + CheckBox del = itemDel.getActionView().findViewById(R.id.action_del); + del.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (autopilotConfigAdapter != null) { + autopilotConfigAdapter.setShowDel(isChecked); + } + } + }); + + MenuItem itemLocation = menu.findItem(R.id.action_location_item); + Button btn_lon = itemLocation.getActionView().findViewById(R.id.btn_lon); + Button btn_lat = itemLocation.getActionView().findViewById(R.id.btn_lat); + lonText = itemLocation.getActionView().findViewById(R.id.lon); + latText = itemLocation.getActionView().findViewById(R.id.lat); + btn_lon.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (lon != -1) { + findEditText(lon); + } + } + }); + btn_lat.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (lat != -1) { + findEditText(lat); + } + } + }); + return true; + } + + private void findEditText(double value) { + View view = getWindow().getDecorView().findFocus(); + if (view instanceof EditText) { + EditText editText = ((EditText) view); + String content = String.valueOf(value); + editText.setText(content); + editText.setSelection(content.length()); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLocationEvent(GnssInfo info) { + if (info != null && info.bean != null) { + lon = info.bean.getLongitude(); + lat = info.bean.getLatitude(); + if (lonText != null) + lonText.setText("Lon:" + lon); + if (latText != null) + latText.setText("Lat:" + lat); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + switch (id) { + case R.id.action_settings_item: + autopilotConfigAdapter.add(); +// linearLayoutManager.scrollToPositionWithOffset(dbAdapter.getItemCount() - 1, 0); + recyclerView.scrollToPosition(autopilotConfigAdapter.getItemCount() - 1); + return true; + case R.id.action_save_item: + onSave(); + return true; + case android.R.id.home: + onBack(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void onBack() { + new AlertDialog.Builder(this) + .setTitle("退出提示") + .setMessage("是否配置页面") + .setNegativeButton("取消", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }) + .setPositiveButton("确认", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + finish(); + } + }).show(); + } + + //返回键处理 + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + onBack(); + return true; + } else { + return super.onKeyDown(keyCode, event); + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/HorizontalDividerItemDecoration.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/HorizontalDividerItemDecoration.java new file mode 100644 index 0000000000..932b4484e9 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/HorizontalDividerItemDecoration.java @@ -0,0 +1,140 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.zhidao.adas.client.ui; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +/** + * DividerItemDecoration is a {@link RecyclerView.ItemDecoration} that can be used as a divider + * between items of a {@link LinearLayoutManager}. It supports both {@link #HORIZONTAL} and + * {@link #VERTICAL} orientations. + * + *

+ *     mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
+ *             mLayoutManager.getOrientation());
+ *     recyclerView.addItemDecoration(mDividerItemDecoration);
+ * 
+ */ +public class HorizontalDividerItemDecoration extends RecyclerView.ItemDecoration { + public static final int HORIZONTAL = LinearLayout.HORIZONTAL; + public static final int VERTICAL = LinearLayout.VERTICAL; + + private static final String TAG = "DividerItem"; + private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; + + private Drawable mDivider; + + + private final Rect mBounds = new Rect(); + + /** + * Creates a divider {@link RecyclerView.ItemDecoration} that can be used with a + * {@link LinearLayoutManager}. + * + * @param context Current context, it will be used to access resources. + */ + public HorizontalDividerItemDecoration(Context context) { + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = a.getDrawable(0); + if (mDivider == null) { + Log.w(TAG, "@android:attr/listDivider was not set in the theme used for this " + + "DividerItemDecoration. Please set that attribute all call setDrawable()"); + } + a.recycle(); + } + + + /** + * Sets the {@link Drawable} for this divider. + * + * @param drawable Drawable that should be used as a divider. + */ + public void setDrawable(@NonNull Drawable drawable) { + if (drawable == null) { + throw new IllegalArgumentException("Drawable cannot be null."); + } + mDivider = drawable; + } + + /** + * @return the {@link Drawable} for this divider. + */ + @Nullable + public Drawable getDrawable() { + return mDivider; + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + if (parent.getLayoutManager() == null || mDivider == null) { + return; + } + drawHorizontal(c, parent); + } + + + private void drawHorizontal(Canvas canvas, RecyclerView parent) { + canvas.save(); + final int top; + final int bottom; + //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides. + if (parent.getClipToPadding()) { + top = parent.getPaddingTop(); + bottom = parent.getHeight() - parent.getPaddingBottom(); + canvas.clipRect(parent.getPaddingLeft(), top, + parent.getWidth() - parent.getPaddingRight(), bottom); + } else { + top = 0; + bottom = parent.getHeight(); + } + + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; ) { + final View child = parent.getChildAt(i); + parent.getLayoutManager().getDecoratedBoundsWithMargins(child, mBounds); + final int right = mBounds.right + Math.round(child.getTranslationX()); + final int left = right - mDivider.getIntrinsicWidth(); + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(canvas); + i += 2; + } + canvas.restore(); + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, + RecyclerView.State state) { + if (mDivider == null) { + outRect.set(0, 0, 0, 0); + return; + } + outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java similarity index 94% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java index 28898aa44d..f2d4534cdf 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.ui; import android.content.Context; import android.os.Bundle; @@ -14,12 +14,14 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.DataShowAdapter; import com.zhidao.adas.client.bean.ArrivalNotification; import com.zhidao.adas.client.bean.AutopilotState; import com.zhidao.adas.client.bean.ErrorData; import com.zhidao.adas.client.bean.GlobalPathResp; import com.zhidao.adas.client.bean.GnssInfo; import com.zhidao.adas.client.bean.MogoReportMessage; +import com.zhidao.adas.client.bean.PerceptionTrafficLight; import com.zhidao.adas.client.bean.RecordPanel; import com.zhidao.adas.client.bean.TrackedObjects; import com.zhidao.adas.client.bean.Trajectory; @@ -27,7 +29,6 @@ import com.zhidao.adas.client.bean.VehicleState; import com.zhidao.adas.client.bean.Warn; import com.zhidao.adas.client.utils.MyLinearLayoutManager; import com.zhidao.support.adas.high.common.CupidLogUtils; -import com.zhidao.support.adas.high.msg.ReportMessage; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -271,7 +272,14 @@ public class InfoFragment extends Fragment { } } - + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onPerceptionTrafficLightEvent(PerceptionTrafficLight info) { + EventBus.getDefault().removeStickyEvent(info); + if (title.equals(MainActivity.TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT)) { + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } @Override public void onDestroyView() { super.onDestroyView(); diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java similarity index 88% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index 8bea944df4..f9fba66d23 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -1,8 +1,10 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.ui; import static com.mogo.telematic.MogoProtocolMsg.NORMAL_DATA; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.text.Editable; @@ -20,6 +22,7 @@ import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.AppCompatButton; import androidx.fragment.app.FragmentManager; @@ -37,8 +40,11 @@ import com.mogo.telematic.client.status.ConnectState; import com.mogo.telematic.server.netty.NettyServerListener; import com.zhidao.adas.client.BuildConfig; import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.InfoTitleAdapter; +import com.zhidao.adas.client.base.BaseActivity; import com.zhidao.adas.client.base.BaseAdapter; import com.zhidao.adas.client.bean.ArrivalNotification; +import com.zhidao.adas.client.bean.AutoPilotMode; import com.zhidao.adas.client.bean.AutopilotState; import com.zhidao.adas.client.bean.BasicInfoReq; import com.zhidao.adas.client.bean.CarConfigResp; @@ -46,6 +52,7 @@ import com.zhidao.adas.client.bean.ErrorData; import com.zhidao.adas.client.bean.GlobalPathResp; import com.zhidao.adas.client.bean.GnssInfo; import com.zhidao.adas.client.bean.MogoReportMessage; +import com.zhidao.adas.client.bean.PerceptionTrafficLight; import com.zhidao.adas.client.bean.RecordPanel; import com.zhidao.adas.client.bean.TrackedObjects; import com.zhidao.adas.client.bean.Trajectory; @@ -66,28 +73,24 @@ import com.zhidao.support.adas.high.common.ProtocolStatus; import com.zhidao.support.recorder.RecordDataManager; import org.greenrobot.eventbus.EventBus; -import org.json.JSONException; -import org.json.JSONObject; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Enumeration; import java.util.List; -import java.util.Timer; -import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import chassis.VehicleStateOuterClass; import io.netty.channel.Channel; import mogo.telematics.pad.MessagePad; import mogo_msg.MogoReportMsg; +import perception.TrafficLightOuterClass; import record_cache.RecordPanelOuterClass; -public class MainActivity extends AppCompatActivity implements OnAdasListener, OnAdasConnectStatusListener, BaseAdapter.OnItemClickListener { +public class MainActivity extends BaseActivity implements OnAdasListener, OnAdasConnectStatusListener, BaseAdapter.OnItemClickListener { private final static String TAG = MainActivity.class.getSimpleName(); private EditText etIp; private TextView role; @@ -106,7 +109,6 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O private RecyclerView infoFragment; private TextView tvConnectState; private ScheduledExecutorService mExecutorServiceConfigTimer; - private Gson gson; private final List titleFragmentData = new ArrayList<>(); @@ -127,6 +129,7 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O private InfoFragment badcseFragment; private InfoFragment errorFragment; private InfoFragment reportMessageFragment; + private InfoFragment perceptionTrafficLightFragment; private VersionFragment versionFragment; private FragmentManager manager; private FragmentTransaction transaction; @@ -135,7 +138,7 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O private long recordKey; private String recordFileName; private int connectStatus; - + private AutoPilotModeDialog autoPilotModeDialog; public interface TITLE { String RECEIVE_TRAJECTORY = "车前引导线"; @@ -144,6 +147,8 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O String RECEIVE_VEHICLE_STATE = "底盘信息"; String RECEIVE_AUTOPILOT_STATE = "自动驾驶状态"; String RECEIVE_REPORT_MESSAGE = "监控事件"; + String RECEIVE_PERCEPTION_TRAFFIC_LIGHT = "感知红绿灯"; + // String RECEIVE_BASIC_INFO_REQ = "自动驾驶设备基础信息请求"; String RECEIVE_CAR_CONFIG_RESP = "信息与配置"; String RECEIVE_RECORD_RESULT = "数据采集结果"; @@ -175,7 +180,7 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); initView(); firstFragment(); - gson = new Gson(); + initAdas(); connectStatus = AdasManager.getInstance().getIpcConnectionStatus(); onUpdateConnectStateView(); @@ -332,6 +337,7 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O titleFragmentData.add(TITLE.RECEIVE_VEHICLE_STATE); titleFragmentData.add(TITLE.RECEIVE_AUTOPILOT_STATE); titleFragmentData.add(TITLE.RECEIVE_REPORT_MESSAGE); + titleFragmentData.add(TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT); titleFragmentData.add(TITLE.RECEIVE_CAR_CONFIG_RESP); titleFragmentData.add(TITLE.RECEIVE_RECORD_RESULT); titleFragmentData.add(TITLE.RECEIVE_GLOBAL_PATH_RESP); @@ -341,15 +347,15 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O titleFragmentData.add(TITLE.RECEIVE_ERROR); - titleBtnData.add("下发站点1"); - titleBtnData.add("下发站点2"); + titleBtnData.add("启动自动驾驶"); titleBtnData.add("自动驾驶路径查询"); titleBtnData.add("下发SN"); titleBtnData.add("数据采集5秒"); titleBtnData.add("数据采集start"); titleBtnData.add("数据采集end"); + titleBtnData.add("录音测试"); titleBtnData.add("发送信号灯"); - titleBtnData.add("速度设置"); + titleBtnData.add("自动驾驶限速"); titleBtnData.add("重启Docker"); titleBtnData.add("重启IPC"); titleBtnData.add("关机"); @@ -481,6 +487,14 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O transaction.commit(); } break; + case TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT: + if (perceptionTrafficLightFragment == null) + perceptionTrafficLightFragment = new InfoFragment(data); + if (!perceptionTrafficLightFragment.isVisible()) { + transaction.replace(R.id.fl_info, perceptionTrafficLightFragment); + transaction.commit(); + } + break; case TITLE.RECEIVE_CAR_CONFIG_RESP: AdasManager.getInstance().sendCarConfigReq(); if (versionFragment == null) @@ -618,6 +632,11 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O EventBus.getDefault().postSticky(new MogoReportMessage(header, mogoReportMessage)); } + @Override + public void onPerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights trafficLights) { + EventBus.getDefault().postSticky(new PerceptionTrafficLight(header, trafficLights)); + } + @Override public void onBasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq basicInfoReq) { BasicInfoReq info = new BasicInfoReq(header, basicInfoReq); @@ -871,82 +890,51 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O @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) { - toastMsg("IPC 未连接"); - return; - } - switch (data) { - case "下发站点1": - MessagePad.Location startLocation = MessagePad.Location.newBuilder() - .setLatitude(26.820319143036112) - .setLongitude(112.57770688564666) - .build(); - MessagePad.Location endLocation = MessagePad.Location.newBuilder() - .setLatitude(26.82355278566775) - .setLongitude(112.57001723522112) - .build(); - MessagePad.RouteInfo info = MessagePad.RouteInfo.newBuilder() - .setStartLocation(startLocation) - .setStartName("KXCNMZ") - .setEndLocation(endLocation) - .setEndName("SDYJKXCXMBZ") -// .addAllWayPoints(null) - .setSpeedLimit(0.0) - .setVehicleType(9) - .setIsSpeakVoice(true) - .build(); - AdasManager.getInstance().sendAutoPilotModeReq(1, 0, info); - //"{\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.82355278566775,\"lon\":112.57001723522112},\"endName\":\"SDYJKXCXMBZ\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.820319143036112,\"lon\":112.57770688564666},\"startName\":\"KXCNMZ\",\"vehicleType\":9,\"wayLatLons\":null}}" -// " {\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.819811964643154,\"lon\":112.57732459897345},\"endName\":\"KXCNMDM\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.823347858814472,\"lon\":112.56994205894226},\"startName\":\"SDYJKXCXMBDM\",\"vehicleType\":9,\"wayLatLons\":null}}" +// if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { +// toastMsg("IPC 未连接"); +// return; +// } + switch (position) { + case 0: + if (autoPilotModeDialog == null) { + autoPilotModeDialog = new AutoPilotModeDialog(this); + } + if (!autoPilotModeDialog.isShowing()) { + autoPilotModeDialog.show(); + } + break; - case "下发站点2": - MessagePad.Location startLocation2 = MessagePad.Location.newBuilder() - .setLatitude(26.823347858814472) - .setLongitude(112.56994205894226) - .build(); - MessagePad.Location endLocation2 = MessagePad.Location.newBuilder() - .setLatitude(26.819811964643154) - .setLongitude(112.57732459897345) - .build(); - MessagePad.RouteInfo info2 = MessagePad.RouteInfo.newBuilder() - .setStartLocation(startLocation2) - .setStartName("SDYJKXCXMBDM") - .setEndLocation(endLocation2) - .setEndName("KXCNMDM") -// .addAllWayPoints(null) - .setSpeedLimit(0.0) - .setVehicleType(9) - .setIsSpeakVoice(true) - .build(); - AdasManager.getInstance().sendAutoPilotModeReq(1, 0, info2); -// "{\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.82355278566775,\"lon\":112.57001723522112},\"endName\":\"SDYJKXCXMBZ\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.820319143036112,\"lon\":112.57770688564666},\"startName\":\"KXCNMZ\",\"vehicleType\":9,\"wayLatLons\":null}}" - //" {\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.819811964643154,\"lon\":112.57732459897345},\"endName\":\"KXCNMDM\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.823347858814472,\"lon\":112.56994205894226},\"startName\":\"SDYJKXCXMBDM\",\"vehicleType\":9,\"wayLatLons\":null}}" - break; - case "自动驾驶路径查询": + case 1: + //自动驾驶路径查询 AdasManager.getInstance().sendGlobalPathReq(); break; - case "下发SN": + case 2: //发送sn AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); break; - case "数据采集5秒": + case 3: + //数据采集5秒 boolean b = AdasManager.getInstance().startRecordPackage(1, 5, 1); CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + b); break; - case "数据采集start": + case 4: + //数据采集start boolean bStart = AdasManager.getInstance().startRecordPackage(1, 1); CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + bStart); break; - case "数据采集end": + case 5: + //数据采集end boolean bEnd = AdasManager.getInstance().stopRecordPackage(1, 1); CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + bEnd); break; - case "录音测试": + case 6: + //录音测试 CupidLogUtils.w(TAG, "录音测试"); RecordDataManager.getInstance().init(MainActivity.this, "1234567", "", 22, "", ""); RecordDataManager.getInstance().record(); break; - case "发送信号灯": + case 7: + //发送信号灯 MessagePad.TrafficLightStatus left = MessagePad.TrafficLightStatus.newBuilder() .setPhaseNo("1") .setColor("R") @@ -969,25 +957,55 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O .build(); AdasManager.getInstance().sendTrafficLightData("10038", 26.848153, 112.574883, "180.0", "SN", 100413, -4, 201, 0, detail); break; - case "速度设置": - AdasManager.getInstance().sendAutopilotSpeedReq(28); + case 8: + //速度设置 + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("自动驾驶限速"); + View view = getLayoutInflater().inflate(R.layout.dialog_speed, null); + final EditText et = (EditText) view.findViewById(R.id.et); + builder.setView(view);// + builder.setCancelable(false);// + builder.setPositiveButton("设置", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Editable editable = et.getText(); + if (TextUtils.isEmpty(editable)) { + // 条件不成立不能关闭 AlertDialog 窗口 + Toast.makeText(MainActivity.this, "请输入速度", Toast.LENGTH_SHORT).show(); + return; + } + String temp = et.getText().toString().trim(); + double speed = Double.parseDouble(temp) / 3.6; + AdasManager.getInstance().sendAutopilotSpeedReq(speed); + } + }); + //设置反面按钮,并做事件处理 + builder.setNegativeButton("取消", null); + builder.show();//显示Dialog对话框 + break; - case "重启Docker": + case 9: + //重启Docker AdasManager.getInstance().rebootAPDocker(); break; - case "重启IPC": + case 10: + //重启IPC AdasManager.getInstance().rebootIPC(); break; - case "关机": + case 11: + //关机 AdasManager.getInstance().shutdownIPC(); break; - case "采集类型": + case 12: + //采集类型 AdasManager.getInstance().sendRecordCause(recordKey, recordFileName, "1", "变道有干扰"); break; - case "打开演示模式": + case 13: + //打开演示模式 AdasManager.getInstance().sendDemoModeReq(1); break; - case "关闭演示模式": + case 14: + //关闭演示模式 AdasManager.getInstance().sendDemoModeReq(0); break; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/UpgradeFragment.java similarity index 98% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/UpgradeFragment.java index c3194b65e4..f2d0de4970 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/UpgradeFragment.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.ui; import android.content.Context; import android.graphics.Color; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java similarity index 98% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java index 66df8cc7cf..3c5e27e49f 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.ui; import android.content.Context; import android.os.Bundle; @@ -21,6 +21,7 @@ import androidx.recyclerview.widget.SimpleItemAnimator; import com.zhidao.adas.client.BuildConfig; import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.ConfigAdapter; import com.zhidao.adas.client.bean.CarConfigResp; import com.zhidao.adas.client.bean.Config; import com.zhidao.support.adas.high.AdasManager; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java deleted file mode 100644 index e9d598dbd7..0000000000 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zhidao.adas.client.ui.autopilot; - -import java.util.List; - -public class AiCloudToStartAutopilot { - - private String action = "aiCloudToStartAutopilot"; - public ResultDTO result; - - public static class ResultDTO { - public EndLatLonDTO endLatLon; - public Integer speedLimit = 20; - public StartLatLonDTO startLatLon; - public List wayLatLons; - - public static class EndLatLonDTO { - public Double lat; - public Double lon; - } - - public static class StartLatLonDTO { - public Double lat; - public Double lon; - } - - public static class WayLatLonsDTO { - public Double lat; - public Double lon; - } - } -} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java deleted file mode 100644 index 351dbe15c9..0000000000 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java +++ /dev/null @@ -1,305 +0,0 @@ -package com.zhidao.adas.client.ui.autopilot; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.text.TextUtils; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.CompoundButton; -import android.widget.EditText; -import android.widget.Switch; -import android.widget.Toast; - -import androidx.appcompat.app.AppCompatActivity; - -import com.google.gson.Gson; - -import com.google.gson.reflect.TypeToken; -import com.zhidao.support.adas.high.AdasManager; -import com.zhidao.adas.client.R; -import com.zhidao.adas.client.utils.Constants; -import com.zhidao.adas.client.utils.PreferencesUtils; - -import java.util.List; - - -public class AutopilotConfigActivity extends AppCompatActivity { - - public static void launch(Context context) { - Intent intent = new Intent(context,AutopilotConfigActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } - - private Gson gson = new Gson(); - private EditText start_lon1; - private EditText start_lat1; - private EditText stop_lon1; - private EditText stop_lat1; - private EditText t_lon1; - private EditText t_lat1; - - private EditText start_lon2; - private EditText start_lat2; - private EditText stop_lon2; - private EditText stop_lat2; - private EditText t_lon2; - private EditText t_lat2; - - private EditText start_lon3; - private EditText start_lat3; - private EditText stop_lon3; - private EditText stop_lat3; - private EditText t_lon3; - private EditText t_lat3; - - private EditText start_lon4; - private EditText start_lat4; - private EditText stop_lon4; - private EditText stop_lat4; - private EditText t_lon4; - private EditText t_lat4; - private List list; - - AiCloudToStartAutopilot data1; - AiCloudToStartAutopilot data2; - AiCloudToStartAutopilot data3; - AiCloudToStartAutopilot data4; - private String init_all_path = "[\n" + - " {\n" + - " \"action\": \"aiCloudToStartAutopilot\",\n" + - " \"result\": {\n" + - " \"endLatLon\": {\n" + - " \"lat\": 26.82355278566775,\n" + - " \"lon\": 112.57001723522112\n" + - " },\n" + - " \"speedLimit\": 20,\n" + - " \"startLatLon\": {\n" + - " \"lat\": 26.820319143036112,\n" + - " \"lon\": 112.57770688564666\n" + - " },\n" + - " \"wayLatLons\": [{\n" + - " \"lat\": 40.1984044,\n" + - " \"lon\": 116.7323222\n" + - " }]\n" + - " }\n" + - " },\n" + - " {\n" + - " \"action\": \"aiCloudToStartAutopilot\",\n" + - " \"result\": {\n" + - " \"endLatLon\": {\n" + - " \"lat\": 40.1979005,\n" + - " \"lon\": 116.7261382\n" + - " },\n" + - " \"speedLimit\": 20,\n" + - " \"startLatLon\": {\n" + - " \"lat\": 40.1992337,\n" + - " \"lon\": 116.7386131\n" + - " },\n" + - " \"wayLatLons\": [{\n" + - " \"lat\": 40.1984044,\n" + - " \"lon\": 116.7323222\n" + - " }]\n" + - " }\n" + - " },\n" + - " {\n" + - " \"action\": \"aiCloudToStartAutopilot\",\n" + - " \"result\": {\n" + - " \"endLatLon\": {\n" + - " \"lat\": 40.1979005,\n" + - " \"lon\": 116.7261382\n" + - " },\n" + - " \"speedLimit\": 20,\n" + - " \"startLatLon\": {\n" + - " \"lat\": 40.1992337,\n" + - " \"lon\": 116.7386131\n" + - " },\n" + - " \"wayLatLons\": [{\n" + - " \"lat\": 40.1984044,\n" + - " \"lon\": 116.7323222\n" + - " }]\n" + - " }\n" + - " },\n" + - " {\n" + - " \"action\": \"aiCloudToStartAutopilot\",\n" + - " \"result\": {\n" + - " \"endLatLon\": {\n" + - " \"lat\": 40.1979005,\n" + - " \"lon\": 116.7261382\n" + - " },\n" + - " \"speedLimit\": 20,\n" + - " \"startLatLon\": {\n" + - " \"lat\": 40.1992337,\n" + - " \"lon\": 116.7386131\n" + - " },\n" + - " \"wayLatLons\": [{\n" + - " \"lat\": 40.1984044,\n" + - " \"lon\": 116.7323222\n" + - " }]\n" + - " }\n" + - " }\n" + - "]"; - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_autopilot_cloud_config); - start_lon1 = findViewById(R.id.start_lon1); - start_lat1 = findViewById(R.id.start_lat1); - stop_lon1 = findViewById(R.id.stop_lon1); - stop_lat1 = findViewById(R.id.stop_lat1); - t_lon1 = findViewById(R.id.t_lon1); - t_lat1 = findViewById(R.id.t_lat1); - - start_lon2 = findViewById(R.id.start_lon2); - start_lat2 = findViewById(R.id.start_lat2); - stop_lon2 = findViewById(R.id.stop_lon2); - stop_lat2 = findViewById(R.id.stop_lat2); - t_lon2 = findViewById(R.id.t_lon2); - t_lat2 = findViewById(R.id.t_lat2); - - start_lon3 = findViewById(R.id.start_lon3); - start_lat3 = findViewById(R.id.start_lat3); - stop_lon3 = findViewById(R.id.stop_lon3); - stop_lat3 = findViewById(R.id.stop_lat3); - t_lon3 = findViewById(R.id.t_lon3); - t_lat3 = findViewById(R.id.t_lat3); - - start_lon4 = findViewById(R.id.start_lon4); - start_lat4 = findViewById(R.id.start_lat4); - stop_lon4 = findViewById(R.id.stop_lon4); - stop_lat4 = findViewById(R.id.stop_lat4); - t_lon4 = findViewById(R.id.t_lon4); - t_lat4 = findViewById(R.id.t_lat4); - //开始执行 - final Button button = findViewById(R.id.start); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - String json = PreferencesUtils.getString(AutopilotConfigActivity.this, Constants.SEL_PATH, null); - if (TextUtils.isEmpty(json)) { - Toast.makeText(AutopilotConfigActivity.this, "请先选择路线", Toast.LENGTH_SHORT).show(); - return; - } - json = json.split("##")[1]; - Log.i("开始执行自动驾驶", json); -// AdasManager.getInstance().aiCloudToAdasData(json); - } - }); - findViewById(R.id.save).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - data1.result.startLatLon.lon = Double.parseDouble(start_lon1.getText().toString().trim()); - data1.result.startLatLon.lat = Double.parseDouble(start_lat1.getText().toString().trim()); - data1.result.endLatLon.lon = Double.parseDouble(stop_lon1.getText().toString().trim()); - data1.result.endLatLon.lat = Double.parseDouble(stop_lat1.getText().toString().trim()); - data1.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon1.getText().toString().trim()); - data1.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat1.getText().toString().trim()); - - - data2.result.startLatLon.lon = Double.parseDouble(start_lon2.getText().toString().trim()); - data2.result.startLatLon.lat = Double.parseDouble(start_lat2.getText().toString().trim()); - data2.result.endLatLon.lon = Double.parseDouble(stop_lon2.getText().toString().trim()); - data2.result.endLatLon.lat = Double.parseDouble(stop_lat2.getText().toString().trim()); - data2.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon2.getText().toString().trim()); - data2.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat2.getText().toString().trim()); - - - data3.result.startLatLon.lon = Double.parseDouble(start_lon3.getText().toString().trim()); - data3.result.startLatLon.lat = Double.parseDouble(start_lat3.getText().toString().trim()); - data3.result.endLatLon.lon = Double.parseDouble(stop_lon3.getText().toString().trim()); - data3.result.endLatLon.lat = Double.parseDouble(stop_lat3.getText().toString().trim()); - data3.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon3.getText().toString().trim()); - data3.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat3.getText().toString().trim()); - - - data4.result.startLatLon.lon = Double.parseDouble(start_lon4.getText().toString().trim()); - data4.result.startLatLon.lat = Double.parseDouble(start_lat4.getText().toString().trim()); - data4.result.endLatLon.lon = Double.parseDouble(stop_lon4.getText().toString().trim()); - data4.result.endLatLon.lat = Double.parseDouble(stop_lat4.getText().toString().trim()); - data4.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon4.getText().toString().trim()); - data4.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat4.getText().toString().trim()); - - - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.ALL_PATH, gson.toJson(list)); - } - }); - View path1 = findViewById(R.id.path1); - View path2 = findViewById(R.id.path2); - View path3 = findViewById(R.id.path3); - View path4 = findViewById(R.id.path4); - path1.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(AutopilotConfigActivity.this, "已设置路线1", Toast.LENGTH_SHORT).show(); - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "1##" + gson.toJson(list.get(0))); - button.setText("开始执行自动驾驶(路线1)"); - } - }); - path2.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(AutopilotConfigActivity.this, "已设置路线2", Toast.LENGTH_SHORT).show(); - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "2##" + gson.toJson(list.get(1))); - button.setText("开始执行自动驾驶(路线2)"); - } - }); - path3.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(AutopilotConfigActivity.this, "已设置路线3", Toast.LENGTH_SHORT).show(); - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "3##" + gson.toJson(list.get(2))); - button.setText("开始执行自动驾驶(路线3)"); - } - }); - path4.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(AutopilotConfigActivity.this, "已设置路线4", Toast.LENGTH_SHORT).show(); - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "4##" + gson.toJson(list.get(3))); - button.setText("开始执行自动驾驶(路线4)"); - } - }); - - String allPath = PreferencesUtils.getString(AutopilotConfigActivity.this, Constants.ALL_PATH, init_all_path); - list = gson.fromJson(allPath, new TypeToken>() { - }.getType()); - data1 = list.get(0); - data2 = list.get(1); - data3 = list.get(2); - data4 = list.get(3); - start_lon1.setText(String.valueOf(data1.result.startLatLon.lon)); - start_lat1.setText(String.valueOf(data1.result.startLatLon.lat)); - stop_lon1.setText(String.valueOf(data1.result.endLatLon.lon)); - stop_lat1.setText(String.valueOf(data1.result.endLatLon.lat)); - t_lon1.setText(String.valueOf(data1.result.wayLatLons.get(0).lon)); - t_lat1.setText(String.valueOf(data1.result.wayLatLons.get(0).lat)); - - start_lon2.setText(String.valueOf(data2.result.startLatLon.lon)); - start_lat2.setText(String.valueOf(data2.result.startLatLon.lat)); - stop_lon2.setText(String.valueOf(data2.result.endLatLon.lon)); - stop_lat2.setText(String.valueOf(data2.result.endLatLon.lat)); - t_lon2.setText(String.valueOf(data2.result.wayLatLons.get(0).lon)); - t_lat2.setText(String.valueOf(data2.result.wayLatLons.get(0).lat)); - - start_lon3.setText(String.valueOf(data3.result.startLatLon.lon)); - start_lat3.setText(String.valueOf(data3.result.startLatLon.lat)); - stop_lon3.setText(String.valueOf(data3.result.endLatLon.lon)); - stop_lat3.setText(String.valueOf(data3.result.endLatLon.lat)); - t_lon3.setText(String.valueOf(data3.result.wayLatLons.get(0).lon)); - t_lat3.setText(String.valueOf(data3.result.wayLatLons.get(0).lat)); - - start_lon4.setText(String.valueOf(data4.result.startLatLon.lon)); - start_lat4.setText(String.valueOf(data4.result.startLatLon.lat)); - stop_lon4.setText(String.valueOf(data4.result.endLatLon.lon)); - stop_lat4.setText(String.valueOf(data4.result.endLatLon.lat)); - t_lon4.setText(String.valueOf(data4.result.wayLatLons.get(0).lon)); - t_lat4.setText(String.valueOf(data4.result.wayLatLons.get(0).lat)); - - - } - -} \ No newline at end of file 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 7764de93a4..a76e17f67a 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 @@ -2,14 +2,58 @@ package com.zhidao.adas.client.utils; import android.content.Context; +import com.google.gson.reflect.TypeToken; +import com.zhidao.adas.client.bean.AutoPilotMode; +import com.zhidao.support.adas.high.common.JsonUtil; + +import java.util.ArrayList; +import java.util.List; + /** * @author song kenan * @des * @date 2021/10/8 */ public class Constants { - public static final String ALL_PATH = "all_path";//所有路线 - public static final String SEL_PATH = "sel_path";//选择的路线 + private static final String ALL_PATH = "all_path";//所有路线 + private static final String DEFAULT_PATH = "[{\"endLatLon\":{\"latitude\":40.19774,\"longitude\":116.72704},\"endName\":\"汇源果汁\",\"name\":\"北京市顺义区北小营镇\",\"speedLimit\":20.0,\"startLatLon\":{\"latitude\":40.20047,\"longitude\":116.73512},\"startName\":\"13号路口西\"},{\"endLatLon\":{\"latitude\":40.19996,\"longitude\":116.73584},\"endName\":\"13号路口(主路)\",\"name\":\"北京市顺义区北小营镇\",\"speedLimit\":20.0,\"startLatLon\":{\"latitude\":40.19763,\"longitude\":116.72686},\"startName\":\"汇源果汁\"}]"; + + public static List getPaths(Context context) { + String json = PreferencesUtils.getString(context, ALL_PATH, DEFAULT_PATH); + List list = JsonUtil.fromJson(json, new TypeToken>() { + }.getType()); + return list; + } + + public static boolean setPath(Context context, List list) { + if (list != null) { + return PreferencesUtils.putString(context, ALL_PATH, JsonUtil.toJson(list)); + } + return false; + } + + public static boolean addPath(Context context, List list, AutoPilotMode mode) { + if (list == null) + list = new ArrayList<>(); + if (!list.contains(mode)) { + list.add(mode); + return PreferencesUtils.putString(context, ALL_PATH, JsonUtil.toJson(list)); + } + return false; + } + + public static boolean delPath(Context context, List list, AutoPilotMode mode) { + if (list == null) { + return PreferencesUtils.delete(context, ALL_PATH); + } else { + if (list.contains(mode)) { + list.remove(mode); + return PreferencesUtils.putString(context, ALL_PATH, JsonUtil.toJson(list)); + } + } + return false; + } + /***********************是否使用固定IP******************/ // 0:固定IP 1:指定 2:UDP diff --git a/app_ipc_monitoring/src/main/res/drawable/bg_dialog.xml b/app_ipc_monitoring/src/main/res/drawable/bg_dialog.xml new file mode 100644 index 0000000000..470ebb3806 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/bg_dialog.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_add_false.xml b/app_ipc_monitoring/src/main/res/drawable/ic_add_false.xml new file mode 100644 index 0000000000..76e20442b6 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_add_false.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_add_true.xml b/app_ipc_monitoring/src/main/res/drawable/ic_add_true.xml new file mode 100644 index 0000000000..1b622a26f5 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_add_true.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_minus_false.xml b/app_ipc_monitoring/src/main/res/drawable/ic_minus_false.xml new file mode 100644 index 0000000000..d32a9ba9f7 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_minus_false.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_minus_true.xml b/app_ipc_monitoring/src/main/res/drawable/ic_minus_true.xml new file mode 100644 index 0000000000..5e3bf24a2c --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_minus_true.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/selector_add.xml b/app_ipc_monitoring/src/main/res/drawable/selector_add.xml new file mode 100644 index 0000000000..b90c10de3e --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/selector_add.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/drawable/selector_minus.xml b/app_ipc_monitoring/src/main/res/drawable/selector_minus.xml new file mode 100644 index 0000000000..4d671adc0f --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/selector_minus.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/drawable/text.xml b/app_ipc_monitoring/src/main/res/drawable/text.xml new file mode 100644 index 0000000000..58c4db851b --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/text.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml b/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml index 131a197495..a7b9a9c4ba 100644 --- a/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml +++ b/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml @@ -1,529 +1,38 @@ - + tools:context=".ui.AutopilotConfigActivity"> - - -