diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt index 8dbc57d0d5..1ebac9af0b 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt @@ -33,6 +33,11 @@ class OchCustomViewProvider : IOchCustomViewProvider { if(temp is FacadeProvider){ commonService = temp.commonService } + }else{ + val temp = ARouter.getInstance().build(FacadeConst.PASSENGER_PATH).navigation(context) + if(temp is FacadeProvider){ + commonService = temp.commonService + } } } diff --git a/OCH/shuttle/driver_weaknet/build.gradle b/OCH/shuttle/driver_weaknet/build.gradle index 3f2bd62161..a230b9a66d 100644 --- a/OCH/shuttle/driver_weaknet/build.gradle +++ b/OCH/shuttle/driver_weaknet/build.gradle @@ -61,6 +61,7 @@ dependencies { implementation rootProject.ext.dependencies.roomRxjava implementation rootProject.ext.dependencies.androidxrecyclerview kapt rootProject.ext.dependencies.recyclerviewadapterhelper + implementation rootProject.ext.dependencies.lottie implementation rootProject.ext.dependencies.androidxroomruntime kapt rootProject.ext.dependencies.androidxroomcompiler diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/data.json b/OCH/shuttle/driver_weaknet/src/main/assets/data.json new file mode 100644 index 0000000000..62cb3f9e9d --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/assets/data.json @@ -0,0 +1 @@ +{"v":"5.12.2","fr":25,"ip":0,"op":55,"w":774,"h":120,"nm":"滑动等待背景","ddd":0,"assets":[{"id":"image_0","w":774,"h":120,"u":"images/","p":"img_2.png","e":0},{"id":"comp_0","nm":"预合成 1","fr":25,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"形状图层 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[99]},{"t":55,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[687,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,127,100]},{"t":55,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"形状图层 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":37,"s":[95]},{"t":50,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[587,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,127,100]},{"t":50,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"形状图层 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[31]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32,"s":[100]},{"t":45,"s":[31]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[487,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32,"s":[100,127,100]},{"t":45,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"形状图层 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[100]},{"t":40,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":27,"s":[100,127,100]},{"t":40,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"形状图层 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[99]},{"t":35,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[287,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,127,100]},{"t":35,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"形状图层 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[99]},{"t":30,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[187,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[100,127,100]},{"t":30,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"形状图层 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[100]},{"t":25,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[100,127,100]},{"t":25,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"预合成 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,60,0],"ix":2,"l":2},"a":{"a":0,"k":[387,60,0],"ix":1,"l":2},"s":{"a":0,"k":[107,52,100],"ix":6,"l":2}},"ao":0,"w":774,"h":120,"ip":0,"op":55,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"滑动等待背景.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,60,0],"ix":2,"l":2},"a":{"a":0,"k":[387,60,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":55,"st":0,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/images/img_0.png b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_0.png new file mode 100644 index 0000000000..0aec427bb4 Binary files /dev/null and b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_0.png differ diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/images/img_1.png b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_1.png new file mode 100644 index 0000000000..2ef15cc469 Binary files /dev/null and b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_1.png differ diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/images/img_2.png b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_2.png new file mode 100644 index 0000000000..a4b68ce5eb Binary files /dev/null and b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_2.png differ diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/slide.json b/OCH/shuttle/driver_weaknet/src/main/assets/slide.json new file mode 100644 index 0000000000..d17a977599 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/assets/slide.json @@ -0,0 +1 @@ +{"v":"5.12.2","fr":25,"ip":0,"op":25,"w":774,"h":120,"nm":"矩形@2x","ddd":0,"assets":[{"id":"image_0","w":87,"h":100,"u":"images/","p":"img_0.png","e":0},{"id":"image_1","w":774,"h":120,"u":"images/","p":"img_1.png","e":0},{"id":"comp_0","nm":"预合成 1","fr":25,"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":13,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1371,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[1511,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1231,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[1371,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1091,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[1231,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[951,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[1091,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[811,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[951,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[671,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[811,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[531,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[671,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[391,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[531,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[251,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[391,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":25,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[111,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[251,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":8,"ty":0,"nm":"预合成 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,60,0],"ix":2,"l":2},"a":{"a":0,"k":[770,60,0],"ix":1,"l":2},"s":{"a":0,"k":[50.649,90,100],"ix":6,"l":2}},"ao":0,"w":1540,"h":120,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"img_1.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,60,0],"ix":2,"l":2},"a":{"a":0,"k":[387,60,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchtask/SwitchLineTaskAdapter.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchtask/SwitchLineTaskAdapter.kt index 38f210681c..55ff7d88dd 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchtask/SwitchLineTaskAdapter.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchtask/SwitchLineTaskAdapter.kt @@ -71,10 +71,12 @@ class SwitchLineTaskAdapter( if(checkTask!!.taskId==task.taskId){ checkTask = null mTaskItemClickListener?.onItemClick(currentPosition,false) + notifyItemChanged(currentPosition) }else { resetOther() checkTask = task mTaskItemClickListener?.onItemClick(currentPosition,true) + notifyItemChanged(currentPosition) } } @@ -88,6 +90,7 @@ class SwitchLineTaskAdapter( if(checkTask!=null && result.taskId==checkTask!!.taskId){ checkTask = null notifyItemChanged(index) + return } } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/view/BizLeaveStationView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/view/BizLeaveStationView.kt index 72aa680c1f..7504d76eb1 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/view/BizLeaveStationView.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/view/BizLeaveStationView.kt @@ -9,8 +9,11 @@ import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.utils.ResourcesUtils +import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.shuttle.weaknet.R import kotlinx.android.synthetic.main.shuttle_weak_task_leave_station_view.view.actv_draggable +import kotlinx.android.synthetic.main.shuttle_weak_task_leave_station_view.view.lottie_bg class BizLeaveStationView @JvmOverloads constructor( context: Context, @@ -38,6 +41,7 @@ class BizLeaveStationView @JvmOverloads constructor( init { LayoutInflater.from(context).inflate(R.layout.shuttle_weak_task_leave_station_view, this, true) draggableButton = findViewById(R.id.actv_draggable) + lottie_bg.setImageAssetsFolder("images") } override fun onAttachedToWindow() { @@ -87,7 +91,12 @@ class BizLeaveStationView @JvmOverloads constructor( duration = 100 }.start() }else if (draggableButton.translationX>=(width-draggableButton.width)){ - slideListener?.slideEnd() + lottie_bg.setAnimation("data.json") + lottie_bg.playAnimation() + actv_draggable.setTextColor(ResourcesUtils.getColor(R.color.shuttle_driver_80FFFFFF)) + RxUtils.createSubscribe(1_000) { + slideListener?.slideEnd() + } }else{ ObjectAnimator.ofFloat( draggableButton, "translationX", draggableButton.translationX, @@ -106,6 +115,9 @@ class BizLeaveStationView @JvmOverloads constructor( override fun onVisibilityAggregated(isVisible: Boolean) { super.onVisibilityAggregated(isVisible) if(isVisible){ + lottie_bg.setAnimation("slide.json") + lottie_bg.playAnimation() + actv_draggable.setTextColor(ResourcesUtils.getColor(R.color.white)) ObjectAnimator.ofFloat( draggableButton, "translationX", draggableButton.translationX, 0f diff --git a/OCH/shuttle/driver_weaknet/src/main/res/drawable/bus_task_current_station_bg.xml b/OCH/shuttle/driver_weaknet/src/main/res/drawable/bus_task_current_station_bg.xml index 5d58260925..9dc73b9a7c 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/drawable/bus_task_current_station_bg.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/drawable/bus_task_current_station_bg.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_task_leave_station_view.xml b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_task_leave_station_view.xml index ce187c43ba..ff7fa80565 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_task_leave_station_view.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_task_leave_station_view.xml @@ -7,14 +7,24 @@ android:layout_width="wrap_content" android:layout_height="wrap_content"> - + + + + + + + + + + app:layout_constraintTop_toTopOf="parent" + app:lottie_fileName="slide.json" + app:lottie_loop="true" + app:lottie_autoPlay="true"/> #BF0E3DBC #BF1E2E89 #D4D4D4 + #80FFFFFF \ No newline at end of file diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index b4482c5db0..cee8353a29 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -17,8 +17,8 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Group; +import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentTransaction; import com.mogo.commons.mvp.IView; @@ -29,7 +29,6 @@ import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager; -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager; import com.mogo.eagle.core.function.hmi.map.MapContainerLayout; import com.mogo.eagle.core.function.view.MapRoamView; @@ -46,9 +45,6 @@ import com.mogo.och.taxi.R; import java.lang.ref.WeakReference; -import me.jessyan.autosize.utils.AutoSizeUtils; - - /** * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况 *

@@ -56,7 +52,7 @@ import me.jessyan.autosize.utils.AutoSizeUtils; * * @author tongchenfei */ -public abstract class BaseTaxiTabFragment> extends MvpFragment implements IMogoMapListener{ +public abstract class BaseTaxiTabFragment> extends MvpFragment implements IMogoMapListener { private static final String TAG = "BaseOchFragment"; private RelativeLayout ctvAutopilotStatusRL; @@ -66,7 +62,7 @@ public abstract class BaseTaxiTabFragment - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE,true) + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, true) ); // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态 findViewById(R.id.btnAutopilotEnable).setOnClickListener(view -> - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE,true) + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, true) ); // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人 findViewById(R.id.btnAutopilotRunning).setOnClickListener(view -> - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING,true) + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, true) ); findViewById(R.id.btnAutopilotmanco).setOnClickListener(view -> - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING,true)); + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING, true)); tvOperationStatus.setOnClickListener(new OnPreventFastClickListener() { @Override @@ -190,16 +186,19 @@ public abstract class BaseTaxiTabFragment(new TaxiPersonalDialogFragment()); - personalDialogFragment.get().show(getActivity().getSupportFragmentManager(), "service_data"); + FragmentActivity activity = getActivity(); + if (activity != null) { + personalDialogFragment.get().show(activity.getSupportFragmentManager(), "service_data"); + } } }); - CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitCustomItem(lineView, new LineView(getContext()),10); + CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitCustomItem(lineView, new LineView(getContext()), 10); } } @@ -245,7 +244,7 @@ public abstract class BaseTaxiTabFragment { - // 获取相对View的坐标,即以此View左上角为原点 - mInViewX = motionEvent.x - mInViewY = motionEvent.y - // 获取相对屏幕的坐标,即以屏幕左上角为原点 - mInScreenX = motionEvent.rawX - mInScreenY = motionEvent.rawY - } - MotionEvent.ACTION_MOVE -> { - // 更新浮动窗口位置参数 - mInScreenX = motionEvent.rawX - mInScreenY = motionEvent.rawY - mWindowParams!!.x = (mInScreenX - mInViewX).toInt() - mWindowParams!!.y = (mInScreenY - mInViewY).toInt() - // 手指移动的时候更新小悬浮窗的位置 - mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams) - } - } +// when (motionEvent?.action) { +// MotionEvent.ACTION_DOWN -> { +// // 获取相对View的坐标,即以此View左上角为原点 +// mInViewX = motionEvent.x +// mInViewY = motionEvent.y +// // 获取相对屏幕的坐标,即以屏幕左上角为原点 +// mInScreenX = motionEvent.rawX +// mInScreenY = motionEvent.rawY +// } +// MotionEvent.ACTION_MOVE -> { +// // 更新浮动窗口位置参数 +// mInScreenX = motionEvent.rawX +// mInScreenY = motionEvent.rawY +// mWindowParams!!.x = (mInScreenX - mInViewX).toInt() +// mWindowParams!!.y = (mInScreenY - mInViewY).toInt() +// // 手指移动的时候更新小悬浮窗的位置 +// mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams) +// } +// } return true } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_reason_list.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_reason_list.xml index bfb99ae3be..7456a3cde6 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_reason_list.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_reason_list.xml @@ -3,7 +3,7 @@ - + - + + android:radius="@dimen/dp_10"/> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml index bb97c8a3a4..0913255420 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml @@ -191,6 +191,8 @@ android:visibility="gone" android:layout_marginTop="@dimen/dp_m_5" android:paddingTop="@dimen/dp_5" + android:layout_marginStart="@dimen/dp_m_1" + android:layout_marginEnd="@dimen/dp_m_1" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt index 2bb25033ac..177d0e00e9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt @@ -8,7 +8,9 @@ import com.mogo.eagle.core.data.enums.Carmodel import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.bone.tab.FaultReasonView import com.mogo.eagle.core.function.hmi.bone.tab.ReportTypeView +import com.mogo.eagle.core.function.hmi.bone.tab.WorkOrderView import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.UiThreadHandler @@ -94,8 +96,23 @@ class BoneTabLayout @JvmOverloads constructor( override fun openWorkOrderView() { workOrderView.visibility = VISIBLE } + + override fun closeReportView() { + updateTabType(TabType.REPORT_INFO) + } }) + faultReasonView.setClickListener(object: FaultReasonView.ClickListener{ + override fun closeFaultReasonView() { + updateTabType(TabType.REPORT_INFO) + } + }) + + workOrderView.setClickListener(object: WorkOrderView.ClickListener{ + override fun closeWorkOrderView() { + updateTabType(TabType.REPORT_INFO) + } + }) } fun setCarNo(carNo: String?) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt index 9b5ca28692..1bf14a8954 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt @@ -325,6 +325,7 @@ class FaultReasonView @JvmOverloads constructor( //取消 tvFaultCancel.setOnClickListener { this@FaultReasonView.visibility = View.GONE + clickListener?.closeFaultReasonView() } } @@ -430,7 +431,7 @@ class FaultReasonView @JvmOverloads constructor( } interface ClickListener { - fun closeWindow() + fun closeFaultReasonView() } /** @@ -448,6 +449,7 @@ class FaultReasonView @JvmOverloads constructor( val successHandler = Handler(Looper.getMainLooper()) successHandler.postDelayed({ this@FaultReasonView.visibility = View.GONE + clickListener?.closeFaultReasonView() },1500) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt index 430fc72531..253aec586e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt @@ -120,8 +120,7 @@ class ReportTypeView @JvmOverloads constructor( //故障类 tvReportTypeFault.setOnClickListener { - //TODO 更改! - if(!ProjectUtils.isSaas()){ + if(ProjectUtils.isSaas()){ clickListener?.openFaultReasonView() }else{ //展示工单上报弹窗 @@ -144,10 +143,12 @@ class ReportTypeView @JvmOverloads constructor( val successHandler = Handler(Looper.getMainLooper()) successHandler.postDelayed({ this@ReportTypeView.visibility = View.GONE + clickListener?.closeReportView() },1500) }else{ ToastUtils.showShort("主动录包命令下发失败") this@ReportTypeView.visibility = View.GONE + clickListener?.closeReportView() } } } @@ -172,6 +173,7 @@ class ReportTypeView @JvmOverloads constructor( if(!hasReportOperate){ ThreadUtils.runOnUiThread { this@ReportTypeView.visibility = View.GONE + clickListener?.closeReportView() } } } @@ -201,6 +203,7 @@ class ReportTypeView @JvmOverloads constructor( val successHandler = Handler(Looper.getMainLooper()) successHandler.postDelayed({ this.visibility = View.GONE + clickListener?.closeReportView() },1500) } } @@ -210,6 +213,7 @@ class ReportTypeView @JvmOverloads constructor( ToastUtils.showShort("故障原因上报失败$msg") ThreadUtils.runOnUiThread { this.visibility = View.GONE + clickListener?.closeReportView() } } @@ -252,6 +256,8 @@ class ReportTypeView @JvmOverloads constructor( interface ClickListener { fun openFaultReasonView() fun openWorkOrderView() + + fun closeReportView() } fun setClickListener(clickListener: ClickListener) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt index 25fb89a38b..d47ece024e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt @@ -73,6 +73,8 @@ class WorkOrderView @JvmOverloads constructor( var ret = 0 // 函数调用返回值 private var audioStatus = false + private var clickListener: ClickListener? = null + init { LayoutInflater.from(context).inflate(R.layout.view_work_order, this, true) initView() @@ -90,7 +92,7 @@ class WorkOrderView @JvmOverloads constructor( private fun initEvent(){ CallerDevaToolsListenerManager.addListener(TAG, this) //弹窗展示时间 - tv_work_order_time.text = resources.getString(R.string.work_order_time) + + tv_work_order_time.text = millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat()) wrap_radio_group.setOnCheckedChangeListener{_, checkedId -> @@ -197,6 +199,7 @@ class WorkOrderView @JvmOverloads constructor( //取消 tv_work_order_cancel.setOnClickListener { this@WorkOrderView.visibility = View.GONE + clickListener?.closeWorkOrderView() } } @@ -302,6 +305,7 @@ class WorkOrderView @JvmOverloads constructor( ToastUtils.showShort("工单上报成功") ThreadUtils.runOnUiThread { this@WorkOrderView.visibility = View.GONE + clickListener?.closeWorkOrderView() } } @@ -309,4 +313,12 @@ class WorkOrderView @JvmOverloads constructor( ToastUtils.showShort("工单上报失败") } + interface ClickListener{ + fun closeWorkOrderView() + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxBubbleView.kt new file mode 100644 index 0000000000..506fff2706 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxBubbleView.kt @@ -0,0 +1,206 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +import android.app.Activity +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.function.api.autopilot.IMoGoNodeStateListener +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.order.IOrderListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerNodeStateListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.MsgBoxBubbleAdapter +import com.mogo.eagle.core.function.msgbox.MsgBoxConfig +import com.mogo.eagle.core.utilcode.util.SoundPoolUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.zhjt.mogo.adas.data.bean.NodeStateInfo +import kotlinx.android.synthetic.main.layout_driver_msg_box_bubble.view.clMsgBubbleLayout +import kotlinx.android.synthetic.main.layout_msg_box_bubble.view.llMsgBubbleLayout +import kotlinx.android.synthetic.main.layout_msg_box_bubble.view.rvBubbleList + +/** + * 司机端消息盒子气泡视图改版视图 + */ +class MsgBoxBubbleView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IOrderListener{ + + init { + LayoutInflater.from(context).inflate(R.layout.layout_msg_box_bubble, this, true) + initView() + } + + var msgBoxBubbleAdapter: MsgBoxBubbleAdapter ?= null + + private val TAG = "DriverMsgBoxBubbleView" + private val dataList :ArrayList = ArrayList() + private var isShowData = true + private var isShowSummary = false //是否展示汇总消息 + + + private fun initView(){ + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + linearLayoutManager.stackFromEnd = true + linearLayoutManager.reverseLayout = true + msgBoxBubbleAdapter = MsgBoxBubbleAdapter(context as Activity) + msgBoxBubbleAdapter?.setChangeListener(object : MsgBoxBubbleAdapter.ChangeViewListener{ + override fun notifyView() { + if(dataList.isEmpty()){ + llMsgBubbleLayout.visibility = View.GONE + } + } + + }) + rvBubbleList.adapter = msgBoxBubbleAdapter + rvBubbleList.layoutManager = linearLayoutManager + } + + /** + * 是否展示接收消息,消息盒子打开状态下不再展示气泡消息 + * @param show true 展示;false 不展示 + */ + fun isShowData(show: Boolean){ + isShowData = show + } + + override fun onDataChanged(category: MsgCategory, msgBoxBean: MsgBoxBean) { + UiThreadHandler.post({ + when (category) { + MsgCategory.NOTICE -> { + MsgBoxConfig.noticeList.add(msgBoxBean) + } + MsgCategory.SYS_INFO -> { + MsgBoxConfig.systemInfoList.add(msgBoxBean) + } + MsgCategory.RECORD_BAG -> { + MsgBoxConfig.recordBagList.add(msgBoxBean) + } + else -> {} + } + if(isShowData){ + if(category == MsgCategory.RECORD_BAG){ + if(!FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isShowBagRecordWindow){ + //弹出被动录包弹窗 + CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true) + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + } + } else if(category == MsgCategory.SYS_INFO){ + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + if(msgBoxBean.type == MsgBoxType.REPORT){ + val reportMsg = msgBoxBean.bean as ReportEntity + //P8-P1均只收在消息盒子里,P0消息盒子弹出,其中P0弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + var isShowReport = false + for(action in reportMsg.actionsList){ + if("ACTION_MANUAL_HANDLE_IMMEDIATELY" == action){ + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + isShowReport = true + } + } + } + if(isShowReport){ + //展示消息 + showData(msgBoxBean) + } + } + } else if(category == MsgCategory.FM_INFO){ + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + if(FunctionBuildConfig.isTakeoverRemind){ + //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 + val fmInfoMsg = msgBoxBean.bean as FMInfoMsg + var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) + fmInfoMsg.fmInfoList?.forEach { faultInfo -> + if(faultInfo.faultActionCount>0){ + faultInfo.faultActionList.forEach {actionCode -> + //获取建议操作级别,得到建议操作级别最高的操作 + if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){ + curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) + } + } + } + } + //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + if(curFaultLevel == 0){ + //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 + // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 + // if (hasNoneFSMNode()) { + //语音提示 + try { + SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips) + }catch (e: Exception){ + e.printStackTrace() + } + //展示消息 + showData(msgBoxBean) + //} + } + } + } + } else{ + if(msgBoxBean.sourceType == DataSourceType.SUMMARY){ + //在一次订单中汇总消息只展示一次 + if(isShowSummary){ + showData(msgBoxBean) + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + isShowSummary = false + } + }else{ + if(msgBoxBean.type == MsgBoxType.V2X){ + //鹰眼650需求,不再展示气泡态V2X消息 + return@post + } + showData(msgBoxBean) + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + } + } + } + }, UiThreadHandler.MODE.QUEUE) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMsgBoxListenerManager.addListener(TAG,this) + CallerOrderListenerManager.addListener(TAG,this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMsgBoxListenerManager.removeListener(TAG) + CallerOrderListenerManager.removeListener(TAG) + } + + override fun onUpdateOrderStatus(inOrder: Boolean) { + isShowSummary = inOrder + } + + private fun showData(msgBoxBean: MsgBoxBean){ + clMsgBubbleLayout.visibility = View.VISIBLE + val msgBoxCountDownBean = MsgBoxCountDownBean(msgBoxBean) + dataList.add(msgBoxCountDownBean) + msgBoxBubbleAdapter?.setData(dataList) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxBubbleAdapter.kt new file mode 100644 index 0000000000..2bb05b64b3 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxBubbleAdapter.kt @@ -0,0 +1,484 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +import android.app.Activity +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.msgbox.AutopilotMsg +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.data.msgbox.FSMMsg +import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.data.msgbox.NoticeFrCloudMsg +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.data.msgbox.SSMMsg +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp +import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform +import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat +import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout + +class MsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.Adapter() { + + private var data: ArrayList ?= null + + private var changeViewListener: ChangeViewListener?=null + + private val operation: Int = 1 + private val operationReturn: Int = 10 + private val operationStop: Int = 11 + private val operationDoorSwitchFail: Int = 13 //车门开启、关闭失败 + private val notice: Int = 2 + private val v2x: Int = 3 + private val report: Int = 4 + private val summary: Int = 5 + private val fm: Int = 6 + private val ssm: Int = 7 + private val autopilot: Int = 8 + private val fsm: Int = 9 + private val none: Int = 10 + + fun setData(data: ArrayList){ + this.data = data + if(data.size>4){ + data.removeAt(0) + } + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + when (viewType) { + operation -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_operation,parent,false) + return BubbleOperationHolder(view) + } + operationReturn -> { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_msg_bubble_operation_return, parent, false) + return BubbleOperationReturnHolder(view) + } + operationStop -> { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_msg_bubble_operation_stop, parent, false) + return BubbleOperationStopHolder(view) + } + operationDoorSwitchFail ->{ + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_msg_bubble_operation_door, parent, false) + return BubbleOperationDoorFailHolder(view) + } + report -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_report,parent,false) + return BubbleReportHolder(view) + } + notice -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_notice,parent,false) + return BubbleNoticeHolder(view) + } + summary -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_summary,parent,false) + return BubbleSummaryHolder(view) + } + fm -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_fm,parent,false) + return BubbleFmHolder(view) + } + ssm -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_ssm,parent,false) + return BubbleSsmHolder(view) + } + autopilot -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_autopilot,parent,false) + return BubbleAutopilotHolder(view) + } + fsm -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_fsm,parent,false) + return BubbleFSMHolder(view) + } + else -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_v2x,parent,false) + return BubbleV2XHolder(view) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is BubbleOperationHolder -> { + data?.let { + val msgBoxBean = it[position].msgBoxBean + val operationMsg = msgBoxBean.bean as OperationMsg + holder.tvBubbleOperationTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvBubbleOperationContent.text = operationMsg.content + holder.clBubbleOperationLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleOperationListener(msgBoxBean) + } + } + } + //运营平台还车通知 + is BubbleOperationReturnHolder -> { + data?.let { + val operationReturnMsg = it[position].msgBoxBean.bean as OperationMsg + holder.tvOperationReturnContent.text = operationReturnMsg.content + holder.tvOperationReturnTime.text = + TimeUtils.millis2String(operationReturnMsg.timestamp, getHourMinFormat()) + } + } + //运营平台靠边停车 + is BubbleOperationStopHolder -> { + data?.let { + val operationStopMsg = it[position].msgBoxBean.bean as OperationMsg + holder.tvOperationStopTime.text = + TimeUtils.millis2String(operationStopMsg.timestamp, getHourMinFormat()) + holder.tvOperationStopContent.text = operationStopMsg.content + } + } + //车门开启关闭失败 + is BubbleOperationDoorFailHolder -> { + data?.let{ + val operationDoorMsg = it[position].msgBoxBean.bean as OperationMsg + holder.tvOperationDoorTime.text = + TimeUtils.millis2String(operationDoorMsg.timestamp, getHourMinFormat()) + holder.tvOperationDoorContent.text = operationDoorMsg.content + } + } + //系统信息消息 + is BubbleReportHolder -> { + data?.let { + val msgBoxBean = it[position].msgBoxBean + val reportEntity = msgBoxBean.bean as ReportEntity + holder.tvBubbleReportTime.text = "时间:${TimeUtils.millis2String(it[position].msgBoxBean.timestamp)}" + holder.tvBubbleReceiveTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + var resultStr = "类型:" + for (result in reportEntity.resultList){ + resultStr = "${resultStr}${CallerAutoPilotControlManager.getReportResultDesc(result)}" + } + holder.tvBubbleReportType.text = resultStr + holder.clReportLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleReportListener(msgBoxBean) + } + } + } + //云公告消息 + is BubbleNoticeHolder -> { + data?.let { + val msgBoxBean = it[position].msgBoxBean.bean + val noticeFrCloudMsg = msgBoxBean as NoticeFrCloudMsg + if(noticeFrCloudMsg.type == 0){ + val noticeNormalData = noticeFrCloudMsg.noticeNormalData + holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvNoticeContent.text = noticeNormalData?.content + GlideApp.with(activity).load(noticeNormalData?.imageUrl).optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivNoticeImage) + holder.tvNoticeCheck.setOnClickListener { + //云公告 + if (noticeNormalData != null) { + CallerHmiManager.showNoticeNormalData(noticeNormalData) + } + } + }else if(noticeFrCloudMsg.type == 1){ + val noticeTrafficStylePushData = noticeFrCloudMsg.trafficPushData + holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvNoticeContent.text = noticeTrafficStylePushData?.content + GlideApp.with(activity).load(noticeTrafficStylePushData?.poiImgUrl).optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivNoticeImage) + holder.tvNoticeCheck.setOnClickListener { + //云公告 + if (noticeTrafficStylePushData != null) { + CallerHmiManager.showTrafficBanner(noticeTrafficStylePushData) + } + } + } + } + } + //V2X消息 + is BubbleV2XHolder -> { + data?.let { + val msgBoxBean = it[position].msgBoxBean + val v2XMsg = msgBoxBean.bean as V2XMsg + holder.tvV2XTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvV2XContent.text = v2XMsg.content + holder.ivV2XImage.setImageDrawable(ResourcesCompat.getDrawable(activity.resources,EventTypeEnumNew.getUpdateIconRes(v2XMsg.type),null)) + holder.clV2XLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleV2XListener(msgBoxBean) + } + if(v2XMsg.type== EventTypeEnumNew.TYPE_VERIFICATION_SUCCESSFUL.poiType||v2XMsg.type == EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.poiType){ + holder.itemView.setBackgroundResource(R.drawable.bg_temp_v2x_success) + }else{ + holder.itemView.setBackgroundResource(R.drawable.bg_msg_box_v2x) + } + if(v2XMsg.communicationType.isNullOrEmpty()){ + holder.tvV2XTitle.text = EventTypeEnumNew.getEventTitle(v2XMsg.type) + }else{ + holder.tvV2XTitle.text = String.format(activity.resources.getString(R.string.v2x_title_content), + v2XMsg.communicationType, EventTypeEnumNew.getEventTitle(v2XMsg.type)) + } + } + } + //汇总消息 + is BubbleSummaryHolder -> { + data?.let { + val summaryMsg = it[position].msgBoxBean.bean as V2XMsg + holder.tvSummaryTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvSummaryContent.text = summaryMsg.content + } + } + //FM信息 + is BubbleFmHolder ->{ + data?.let { + val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg + if(fmMsg.policyTime == null){ + holder.tvBubbleFmTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + }else{ + holder.tvBubbleFmTime.text = TimeUtils.millis2String(fmMsg.policyTime!!,getHourMinFormat()) + } + if(fmMsg.fmInfoList?.size == 0){ + holder.tvBubbleFmFaultAction.text = "建议操作:暂无" + holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode) + }else{ + var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) + fmMsg.fmInfoList?.forEach { faultInfo -> + if(faultInfo.faultActionCount>0){ + faultInfo.faultActionList.forEach {actionCode -> + //获取建议操作级别,得到建议操作级别最高的操作 + if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){ + curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) + } + } + } + } + val faultAction = MsgFmData.FaultAction.getFaultAction(curFaultLevel) + holder.tvBubbleFmFault.text = faultAction + //当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、 + // 联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容 + if(curFaultLevel == 5){ + holder.tvBubbleFmFaultAction.text = "建议操作:暂无" + }else{ + holder.tvBubbleFmFaultAction.text = "${faultAction}(${MsgFmData.FaultAction.getFaultActionCode(curFaultLevel)})" + } + //不同级别的Icon显示 + when(curFaultLevel){ + 0->{ + //重度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) + } + 1,2,3->{ + //中度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) + } + 4,5->{ + //轻度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + } + } + } + } + } + //SSM连接消息 + is BubbleSsmHolder ->{ + data?.let { + val ssmMsg = it[position].msgBoxBean.bean as SSMMsg + holder.tvSsmTitle.text = ssmMsg.title + holder.tvSsmContent.text= ssmMsg.content + holder.tvSsmTime.text = TimeUtils.millis2String(ssmMsg.timestamp,getHourMinFormat()) + } + } + //域控制器连接消息 + is BubbleAutopilotHolder ->{ + data?.let { + val autopilotMsg = it[position].msgBoxBean.bean as AutopilotMsg + holder.tvAutopilotTitle.text = autopilotMsg.title + holder.tvAutopilotContent.text = autopilotMsg.content + holder.tvAutopilotTime.text = TimeUtils.millis2String(autopilotMsg.timestamp,getHourMinFormat()) + } + } + + //FSM消息 + is BubbleFSMHolder ->{ + data?.let { + val fsmMsg = it[position].msgBoxBean.bean as FSMMsg + holder.tvFSMTitle.text = fsmMsg.title + holder.tvFSMContent.text = fsmMsg.content + holder.tvFSMTime.text = TimeUtils.millis2String(fsmMsg.timestamp,getHourMinFormat()) + } + } + } + + val msgBoxBean: MsgBoxCountDownBean = data!![position] + msgBoxBean.countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),1000){ + override fun onTick(p0: Long) { + + } + + override fun onFinish() { + data?.remove(msgBoxBean) + changeViewListener?.notifyView() + notifyDataSetChanged() + } + + } + msgBoxBean.countDownTimer?.start() + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + return if(data!![position].msgBoxBean.type == MsgBoxType.OPERATION){ + when ((data!![position].msgBoxBean.bean as OperationMsg).type) { + 0 -> { + //运营平台还车通知 + operationReturn + } + 1 -> { + //运营平台靠边停车 + operationStop + } + 3 -> { + //车门开启关闭失败 + operationDoorSwitchFail + } + else -> { + //普通运营平台 + operation + } + } + }else if(data!![position].msgBoxBean.type == MsgBoxType.REPORT){ + report + }else if(data!![position].msgBoxBean.type == MsgBoxType.NOTICE){ + notice + }else if(data!![position].msgBoxBean.type == MsgBoxType.V2X && data!![position].msgBoxBean.sourceType == DataSourceType.SUMMARY){ + summary + }else if(data!![position].msgBoxBean.type == MsgBoxType.FMINFO){ + fm + }else if(data!![position].msgBoxBean.type == MsgBoxType.SSMINFO){ + ssm + }else if(data!![position].msgBoxBean.type == MsgBoxType.AUTOPILOT){ + autopilot + }else if(data!![position].msgBoxBean.type == MsgBoxType.FSM){ + fsm + } else { + v2x + } + } + + fun setChangeListener(listener: ChangeViewListener){ + changeViewListener = listener + } + + interface ChangeViewListener{ + fun notifyView() + } + + //车辆系统信息 + class BubbleReportHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBubbleReportTime: TextView = itemView.findViewById(R.id.tvBubbleReportTime) + var tvBubbleReportType: TextView = itemView.findViewById(R.id.tvBubbleReportType) + var tvBubbleReceiveTime: TextView = itemView.findViewById(R.id.tvBubbleReceiveTime) + var clReportLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clReportLayout) + } + + //运营平台 + class BubbleOperationHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBubbleOperationTime: TextView = itemView.findViewById(R.id.tvBubbleOperationTime) + var tvBubbleOperationContent: TextView = itemView.findViewById(R.id.tvBubbleOperationContent) + var clBubbleOperationLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clBubbleOperationLayout) + } + + //运营平台还车通知 + class BubbleOperationReturnHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvOperationReturnTime: TextView = itemView.findViewById(R.id.tvOperationReturnTime) + var tvOperationReturnContent: TextView = itemView.findViewById(R.id.tvOperationReturnContent) + } + + //运营平台靠边停车通知 + class BubbleOperationStopHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvOperationStopTime: TextView = itemView.findViewById(R.id.tvOperationStopTime) + var tvOperationStopContent: TextView = itemView.findViewById(R.id.tvOperationStopContent) + } + //车门开启关闭失败 + class BubbleOperationDoorFailHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvOperationDoorTime: TextView = itemView.findViewById(R.id.tvOperationDoorTime) + var tvOperationDoorContent: TextView = itemView.findViewById(R.id.tvOperationDoorContent) + } + //Notice + class BubbleNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivNoticeImage: ImageView = itemView.findViewById(R.id.ivNoticeImage) + // var tvNoticeTitle: TextView = itemView.findViewById(R.id.tvNoticeTitle) + var tvNoticeTime: TextView = itemView.findViewById(R.id.tvNoticeTime) + var tvNoticeCheck: TextView = itemView.findViewById(R.id.tvNoticeCheck) + var tvNoticeContent: TextView = itemView.findViewById(R.id.tvNoticeContent) + } + + //V2X + class BubbleV2XHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivV2XImage: ImageView = itemView.findViewById(R.id.ivV2XImage) + var tvV2XTime: TextView = itemView.findViewById(R.id.tvV2XTime) + var tvV2XContent: TextView = itemView.findViewById(R.id.tvV2XContent) + var clV2XLayout: ConstraintLayout = itemView.findViewById(R.id.clV2XLayout) + var tvV2XTitle: TextView = itemView.findViewById(R.id.tvV2XTitle) + } + + //汇总消息 + class BubbleSummaryHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvSummaryContent: TextView = itemView.findViewById(R.id.tvSummaryContent) + var tvSummaryTime: TextView = itemView.findViewById(R.id.tvSummaryTime) + } + + //FM消息 + class BubbleFmHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBubbleFmFault: TextView = itemView.findViewById(R.id.tvBubbleFmFault) + var tvBubbleFmFaultAction: TextView = itemView.findViewById(R.id.tvBubbleFmFaultAction) + var tvBubbleFmTime: TextView = itemView.findViewById(R.id.tvBubbleFmTime) + var ivBubbleFmImage: ImageView = itemView.findViewById(R.id.ivBubbleFmImage) + } + + //SSM连接消息 + class BubbleSsmHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivSsmImage: ImageView = itemView.findViewById(R.id.ivSsmImage) + var tvSsmTitle: TextView = itemView.findViewById(R.id.tvSsmTitle) + var tvSsmTime: TextView = itemView.findViewById(R.id.tvSsmTime) + var tvSsmContent: TextView = itemView.findViewById(R.id.tvSsmContent) + } + + //域控制器连接状态消息 + class BubbleAutopilotHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivAutopilotImage: ImageView = itemView.findViewById(R.id.ivAutopilotImage) + var tvAutopilotTitle: TextView = itemView.findViewById(R.id.tvAutopilotTitle) + var tvAutopilotTime: TextView = itemView.findViewById(R.id.tvAutopilotTime) + var tvAutopilotContent: TextView = itemView.findViewById(R.id.tvAutopilotContent) + } + + //FSM状态消息(现阶段提示启动自驾失败消息,过渡阶段提示,未来展示fsm消息提醒) + class BubbleFSMHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivFSMImage: ImageView = itemView.findViewById(R.id.ivFSMImage) + var tvFSMTitle: TextView = itemView.findViewById(R.id.tvFSMTitle) + var tvFSMTime: TextView = itemView.findViewById(R.id.tvFSMTime) + var tvFSMContent: TextView = itemView.findViewById(R.id.tvFSMContent) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt index 79fba3c154..c3bc7a662f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.LinearLayout import androidx.annotation.CallSuper import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceGroup @@ -22,11 +23,14 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.data.obu.MogoObuConst +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN +import com.mogo.eagle.core.function.api.setting.ISopSettingListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager @@ -35,20 +39,26 @@ import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager +import com.mogo.eagle.core.function.call.vehicle.CallerSweeperModeListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithMoFang import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithSpeedSetting import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithUnmanInterval import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithWelcomeWords +import com.mogo.eagle.core.function.hmi.ui.tools.SweeperModeChangedConfirmDialog import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction import com.mogo.eagle.core.function.hmi.ui.utils.SOPAnalyticsManager.clickEventAnalytics import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.vehicle.SweeperVehicleConfigUtils import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration +import com.mogo.eagle.core.utilcode.util.AppStateManager import com.mogo.eagle.core.utilcode.util.ToastUtils import kotlinx.android.synthetic.main.layout_operate_panel.view.iv_operate_panel_close +import kotlinx.coroutines.launch import me.jessyan.autosize.utils.AutoSizeUtils +import mogo.telematics.pad.MessagePad class OperatePanelLayout : LinearLayout { @@ -397,14 +407,35 @@ class OperatePanelLayout : LinearLayout { } } - class DemoPreferenceFragmentCompat : OperatePanelDetailBase() { + class DemoPreferenceFragmentCompat : OperatePanelDetailBase(), IViewControlListener { companion object { + private const val TAG = "DemoPreferenceFragmentCompat" private const val KEY_DEMO_SWITCH = "demo_switch" private const val KEY_RECORD_BAG_DIALOG = "record_bag_dialog" private const val KEY_TAKE_OVER_WAKE = "take_over_wake" } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + CallerHmiViewControlListenerManager.addListener(TAG, this) + } + + override fun updateFuncMode(tag: String, checked: Boolean) { + super.updateFuncMode(tag, checked) + if (tag == FUNC_MODE_DEMO) { + preferenceScreen.findPreferenceReal(KEY_DEMO_SWITCH)?.also { + it.extras.putBoolean("is_pressed", false) + changeValue(it, checked) + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + CallerHmiViewControlListenerManager.removeListener(TAG) + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.operate_panel_preference_details_demo, rootKey) } @@ -427,13 +458,17 @@ class OperatePanelLayout : LinearLayout { override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { when (preference.key) { KEY_DEMO_SWITCH -> { + val isPressed = preference.extras.getBoolean("is_pressed", true) + if (!isPressed) { + preference.extras.remove("is_pressed") + return true + } val isChecked = newValue as? Boolean ?: false hmiAction("SOP 演示模式开关, ", !FunctionBuildConfig.isDemoMode) clickEventAnalytics("美化模式", isChecked) FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_DEMO, FunctionBuildConfig.isDemoMode) - CallerSopSettingManager.invokeDemoModeListener(isChecked) if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机 CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode) } @@ -455,14 +490,35 @@ class OperatePanelLayout : LinearLayout { } } - class HdMapPreferenceFragmentCompat : OperatePanelDetailBase() { + class HdMapPreferenceFragmentCompat : OperatePanelDetailBase(), ISopSettingListener { companion object { + private const val TAG = "HdMapPreferenceFragmentCompat" private const val KEY_DANGER_OBSTACLES_COLOR_MARK = "danger_obstacles_color_mark" private const val KEY_ROUTE_GUIDE_LINE_DYNAMIC_EFFECT = "route_guide_line_dynamic_effect" private const val KEY_POINT_CLOUD_EFFECT = "point_cloud_effect" private const val KEY_SELF_CAR_APERTURE = "self_car_aperture" } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + CallerSopSettingManager.addListener(TAG, this) + } + + override fun onDestroyView() { + super.onDestroyView() + CallerSopSettingManager.removeListener(TAG) + } + + override fun onPointCloudClickEvent(status: Boolean) { + super.onPointCloudClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_POINT_CLOUD_EFFECT)?.also { changeValue(it, status) } + } + + override fun onCarApertureClickEvent(status: Boolean) { + super.onCarApertureClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_SELF_CAR_APERTURE)?.also { changeValue(it, status) } + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.operate_panel_preference_details_hdmap, rootKey) } @@ -539,11 +595,12 @@ class OperatePanelLayout : LinearLayout { private const val KEY_RED_OR_GREEN_LIGHT_MERGE_MARKER = "red_or_green_light_merge_marker" private const val KEY_FAULT_REPORT_TIP = "fault_report_tip" private const val KEY_LIMIT_SPEED_MARKER = "limit_speed_marker" - private const val KEY_SELF_ROUTING_VERIFY_MODE = "self_routing_verify_mode" - private const val KEY_LOOK_AROUND_360 = "look_around_360" private const val KEY_WEATHER_EFFECT_SWITCH = "weather_effect_switch" private const val KEY_SYSTEM_BOOT_STATUS_SHOW = "system_boot_status_show" + private const val KEY_SELF_ROUTING_VERIFY_MODE = "self_routing_verify_mode" private const val KEY_UNMANNED_DEMO_PULL_INTERVAL = "unmanned_demo_pull_interval" + private const val KEY_SWEEPER_CLOUD_CONTROL = "sweeper_cloud_control" + private const val KEY_LOOK_AROUND_360 = "look_around_360" } override fun getDefaultVal(pref: Preference): Any? { @@ -575,6 +632,16 @@ class OperatePanelLayout : LinearLayout { KEY_UNMANNED_DEMO_PULL_INTERVAL -> { return CallerUnmannedListenerManager.getVirtualTaskPullTaskIntervalF() } + KEY_SWEEPER_CLOUD_CONTROL -> { + if (!isEnabled(pref)) { + return false + } + return if (SweeperVehicleConfigUtils.isSPExistCurrentSweeperModeConfig()) { + SweeperVehicleConfigUtils.isSPCurrentSweeperCloudMode() + } else { + SweeperVehicleConfigUtils.isDefaultSweeperCloudMode(FunctionBuildConfig.sweeperDefaultMode) + } + } } return super.getDefaultVal(pref) } @@ -590,6 +657,9 @@ class OperatePanelLayout : LinearLayout { KEY_WEATHER_EFFECT_SWITCH -> { AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) } + KEY_SWEEPER_CLOUD_CONTROL -> { + return AppIdentityModeUtils.isSweeper(FunctionBuildConfig.appIdentityMode) && (SweeperVehicleConfigUtils.isDefaultSweeperCanSwitchMode(FunctionBuildConfig.sweeperCanSwitchMode)) + } else -> super.isEnabled(pref) } } @@ -606,7 +676,7 @@ class OperatePanelLayout : LinearLayout { PreferenceWithUnmanInterval.Interval.FORTY_FIVE_SECOND -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(45) PreferenceWithUnmanInterval.Interval.NEVER -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(-1) } - clickEventAnalytics("Taxi无人化演练任务拉取时间间隔",true) + clickEventAnalytics("Taxi无人化演练任务拉取时间间隔", true) } } return super.onPreferenceClick(preference) @@ -701,6 +771,27 @@ class OperatePanelLayout : LinearLayout { HmiBuildConfig.isShowConnectionProgressView = isChecked CallerHmiViewControlListenerManager.updateConnectionProgressView(isChecked) } + KEY_SWEEPER_CLOUD_CONTROL -> { + val isChecked = newValue as? Boolean ?: false + val activity = AppStateManager.currentActivity() + if (activity != null) { + val confirmDialog = SweeperModeChangedConfirmDialog(activity) + confirmDialog.setClickListener(object: SweeperModeChangedConfirmDialog.ClickListener { + override fun confirm() { + CallerSweeperModeListenerManager.invokeSweeperModeListeners( + if (isChecked) SweeperVehicleConfigUtils.BUSINESS_MODE_CLOUD + else SweeperVehicleConfigUtils.BUSINESS_MODE_OPERATE + ) + } + + override fun cancel() { + preferenceScreen.findPreferenceReal(KEY_WEATHER_EFFECT_SWITCH)?.also { changeValue(it, !isChecked) } + } + }) + confirmDialog.showSweeperModeChangeConfirmDialog() + } + clickEventAnalytics("清扫云控业务",isChecked) + } } return super.onPreferenceChange(preference, newValue) } @@ -788,8 +879,9 @@ class OperatePanelLayout : LinearLayout { } } - class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase() { + class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoAutopilotCarConfigListener, ISopSettingListener, IViewControlListener { companion object { + private const val TAG = "VehiclesPreferenceFragmentCompat" private const val KEY_PNC_PARK_INTERSECTION_CAR = "pnc_park_intersection_car" private const val KEY_PNC_PARK_OVERTAKE_CAR = "pnc_park_overtake_car" private const val KEY_DETOUR_RETARD_PARK = "detour_retard_park" @@ -807,10 +899,52 @@ class OperatePanelLayout : LinearLayout { private const val KEY_OVERTAKE_SPEED_THRESHOLDSS = "overtake_speed_thresholds" } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + CallerSopSettingManager.addListener(TAG, this) + CallerHmiViewControlListenerManager.addListener(TAG, this) + return super.onCreateView(inflater, container, savedInstanceState) + } + + override fun updateFuncMode(tag: String, checked: Boolean) { + super.updateFuncMode(tag, checked) + if (tag == FUNC_MODE_RAIN) { + preferenceScreen.findPreferenceReal(KEY_RAIN_DAY)?.also { + it.extras.putBoolean("is_pressed", false) + changeValue(it, checked) + } + } + } + + override fun onDestroyView() { + CallerAutopilotCarConfigListenerManager.removeListener(TAG) + CallerSopSettingManager.removeListener(TAG) + CallerHmiViewControlListenerManager.removeListener(TAG) + super.onDestroyView() + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.operate_panel_preference_details_vehicles, rootKey) } + override fun onExamControlClickEvent(status: Boolean) { + super.onExamControlClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_EXAM_FUNCTION_PANEL)?.also { changeValue(it, status) } + } + + override fun onRainModeClickEvent(status: Boolean) { + super.onRainModeClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_RAIN_DAY)?.also { changeValue(it, status) } + } + + override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { + super.onAutopilotCarConfig(carConfigResp) + lifecycleScope.launch { + val max = carConfigResp.speedLimit * 3.6 + preferenceScreen.findPreferenceReal(KEY_AUTO_PILOT_SPEED_THRESHOLDS)?.update(listOf("0", "$max", "$max", "5")) + } + } + override fun isEnabled(pref: Preference): Boolean { when (pref.key) { KEY_AUTO_PILOT_SPEED_THRESHOLDS, KEY_OVERTAKE_SPEED_THRESHOLDSS -> { @@ -855,13 +989,14 @@ class OperatePanelLayout : LinearLayout { KEY_PURE_OBU_MODE -> { return FunctionBuildConfig.fusionMode == 5 } + KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { + return listOf("0.0", "${FunctionBuildConfig.maxSpeedLimit}", "${FunctionBuildConfig.maxSpeedLimit}", "5.0") + } KEY_CHANGE_LANE_SPEED_THRESHOLDS -> { - return setOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5") + return listOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5") } KEY_OVERTAKE_SPEED_THRESHOLDSS -> { - return setOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5") - } - KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { //TODO renwj 自动驾驶速度阈值,旧版本没有看到 + return listOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5") } } return super.getDefaultVal(pref) @@ -871,7 +1006,20 @@ class OperatePanelLayout : LinearLayout { Log.d(TAG, "-- onPreferenceClick --:pref -> $preference") when (preference.key) { KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { - FunctionBuildConfig.detouringSpeed = preference.extras.getFloat(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.detouringSpeed.toFloat()).toInt() + FunctionBuildConfig.maxSpeedLimit = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.maxSpeedLimit) + val isSuccess = CallerAutoPilotControlManager.setAutoPilotSpeed(FunctionBuildConfig.maxSpeedLimit.toInt()) + when { + isSuccess -> { + ToastUtils.showShort("车速设置成功,立即生效") + } + else -> { + ToastUtils.showShort("设置车速失败,请启动域控制器") + } + } + return true + } + KEY_CHANGE_LANE_SPEED_THRESHOLDS -> { + FunctionBuildConfig.detouringSpeed = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.detouringSpeed.toDouble()).toInt() hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed) val isSuccess = CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble()) if (isSuccess == true) { @@ -882,9 +1030,10 @@ class OperatePanelLayout : LinearLayout { hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "失败") } clickEventAnalytics("变道速度阈值", true) + return true } KEY_OVERTAKE_SPEED_THRESHOLDSS -> { - FunctionBuildConfig.overTakeSpeed = preference.extras.getFloat(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.overTakeSpeed) + FunctionBuildConfig.overTakeSpeed = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.overTakeSpeed.toDouble()).toFloat() val isSuccess = CallerAutoPilotControlManager.sendOvertakeMaxSpeed(FunctionBuildConfig.overTakeSpeed.toDouble()) if (isSuccess == true) { ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置成功") @@ -894,6 +1043,7 @@ class OperatePanelLayout : LinearLayout { hmiAction("SOP 超车目标障碍物速度阈值设置", "失败") } clickEventAnalytics("超车速度阈值", true) + return true } } return super.onPreferenceClick(preference) @@ -906,12 +1056,14 @@ class OperatePanelLayout : LinearLayout { hmiAction("SOP PNC-park-会车, ", isChecked) CallerAutoPilotControlManager.sendParkVehCross(isChecked) FunctionBuildConfig.isOpenParkVehCross = isChecked + return true } KEY_PNC_PARK_OVERTAKE_CAR -> { val isChecked = newValue as? Boolean ?: false hmiAction("SOP PNC-park-超车, ", isChecked) CallerAutoPilotControlManager.sendParkVehOvertake(isChecked) FunctionBuildConfig.isOpenOvertake = isChecked + return true } KEY_DETOUR_RETARD_PARK -> { val isChecked = newValue as? Boolean ?: false @@ -919,8 +1071,14 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendDetouring(isChecked) FunctionBuildConfig.isDetouring = isChecked clickEventAnalytics("绕障类功能", isChecked) + return true } KEY_RAIN_DAY -> { + val isPressed = preference.extras.getBoolean("is_pressed", true) + if (!isPressed) { + preference.extras.remove("is_pressed") + return true + } val isChecked = newValue as? Boolean ?: false hmiAction("SOP 雨天模式开关, ", isChecked) clickEventAnalytics("雨天模式", isChecked) @@ -928,6 +1086,7 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.setRainMode(isChecked) CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_RAIN, isChecked) CallerSopSettingManager.invokeRainModeListener(isChecked) + return true } KEY_WEAK_NET_DECELERATION_PARK -> { val isChecked = newValue as? Boolean ?: false @@ -935,6 +1094,7 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendWeakNetSlowDown(isChecked) hmiAction("SOP 弱网减速停车, ", isChecked) clickEventAnalytics("弱网减速停车", isChecked) + return true } KEY_FAULT_DECELERATION_PARK -> { val isChecked = newValue as? Boolean ?: false @@ -942,6 +1102,7 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendBreakdownSlowDown(isChecked) hmiAction("SOP 故障减速停车, ", isChecked) clickEventAnalytics("故障减速停车", isChecked) + return true } KEY_EXAM_FUNCTION_PANEL -> { val isChecked = newValue as? Boolean ?: false @@ -949,36 +1110,42 @@ class OperatePanelLayout : LinearLayout { CallerDevaToolsManager.showExamControlWindow(isChecked) hmiAction("SOP 考试功能面板, ", isChecked) clickEventAnalytics("考试功能面板", isChecked) + return true } KEY_ALL_MERGE_MODE -> { FunctionBuildConfig.fusionMode = 1 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } KEY_BLIND_AREA_MODE -> { FunctionBuildConfig.fusionMode = 2 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } KEY_BEYOND_VISUAL_RANGE_MODE -> { FunctionBuildConfig.fusionMode = 3 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } KEY_TRANSPARENT_TRANSFER_MODE -> { FunctionBuildConfig.fusionMode = 4 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } KEY_PURE_OBU_MODE -> { FunctionBuildConfig.fusionMode = 5 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } } return super.onPreferenceChange(preference, newValue) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt index aa5d4c529d..746b02b3ba 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt @@ -21,24 +21,34 @@ class PreferenceWithSpeedSetting : Preference { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context) : super(context) - private var mDefaultValueSet: Any? = null + private var mSpeedData: Any? = null + private var mFlag = true override fun setDefaultValue(defaultValue: Any?) { super.setDefaultValue(defaultValue) - mDefaultValueSet = defaultValue + mSpeedData = defaultValue notifyChanged() } + fun update(data: List) { + mSpeedData = data + notifyChanged() + } + + override fun onSetInitialValue(defaultValue: Any?) { + super.onSetInitialValue(defaultValue) + } + override fun onBindViewHolder(holder: PreferenceViewHolder) { super.onBindViewHolder(holder) - val defaultSet = mDefaultValueSet ?: return - if (defaultSet !is Set<*> || defaultSet.size != 4) { + val speedData = mSpeedData ?: return + if (speedData !is List<*> || speedData.size != 4) { throw AssertionError() } - val min = (defaultSet.elementAt(0) as String).toFloat() - val max = (defaultSet.elementAt(1) as String).toFloat() - var cur = (defaultSet.elementAt(2) as String).toFloat() - val step = (defaultSet.elementAt(3) as String).toFloat() + val min = (speedData.elementAt(0) as String).toDouble() + val max = (speedData.elementAt(1) as String).toDouble() + var cur = (speedData.elementAt(2) as String).toDouble() + val step = (speedData.elementAt(3) as String).toDouble() if (min > max) { throw AssertionError() } @@ -52,7 +62,7 @@ class PreferenceWithSpeedSetting : Preference { val btnOk = holder.findViewById(R.id.bt_ok) val speedLimit = holder.findViewById(R.id.tv_speed_limit) as? TextView if (speedLimit?.tag != null && speedLimit.tag is Float) { - cur = max(cur, speedLimit.tag as Float) + cur = max(cur, speedLimit.tag as Double) } speedLimit?.text = cur.toString() val minus = holder.findViewById(R.id.iv_speed_minus) @@ -83,11 +93,14 @@ class PreferenceWithSpeedSetting : Preference { speedLimit?.tag = addAfter speedLimit?.text = addAfter.toString() } - btnOk.isEnabled = false + if (mFlag) { + mFlag = false + btnOk.isEnabled = false + } btnOk.setOnClickListener(null) btnOk.onClick { onPreferenceClickListener?.also { - extras.putFloat(KEY_BUNDLE_CURRENT_VALUE, cur) + extras.putDouble(KEY_BUNDLE_CURRENT_VALUE, cur) it.onPreferenceClick(this) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_msg_box_bubble.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_msg_box_bubble.xml new file mode 100644 index 0000000000..e8a0ce25ed --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_msg_box_bubble.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel.xml index 0e11fe1a9f..b33f81bce6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel.xml @@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/dp_86" android:layout_marginStart="@dimen/dp_60" - android:layout_marginTop="@dimen/dp_112" + android:layout_marginTop="@dimen/dp_56" android:orientation="horizontal"> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml index 78d511e5e8..3dfd09b5b0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml @@ -2,6 +2,7 @@ - - diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/xml/operate_panel_preference_details_business.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/xml/operate_panel_preference_details_business.xml index aa29fb28f3..99ceb91076 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/xml/operate_panel_preference_details_business.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/xml/operate_panel_preference_details_business.xml @@ -27,18 +27,6 @@ android:title="限速标识" android:persistent="false" android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" /> - - + + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index c68c7834f4..f4b11751e2 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -441,4 +441,11 @@ object FunctionBuildConfig { @Volatile @JvmField var welcomeWords: String? = null + + /** + * 最大限速值 + */ + @Volatile + @JvmField + var maxSpeedLimit: Double = 0.0 } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt index dbf75c5c27..be3164e6b4 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.autopilot +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.call.base.CallerBase import mogo.telematics.pad.MessagePad @@ -28,6 +29,7 @@ object CallerAutopilotCarConfigListenerManager : CallerBase