From 5fc63bbd7b128507a9df3b1895a3c8d3d1f4ca19 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Tue, 29 Dec 2020 15:59:43 +0800 Subject: [PATCH 01/51] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=97=B6=E7=99=BD=E5=A4=A9=E3=80=81=E5=A4=9C?= =?UTF-8?q?=E9=97=B4=E6=A8=A1=E5=BC=8F=E7=9A=84=E8=AE=BE=E7=BD=AE=E6=97=B6?= =?UTF-8?q?=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/module/main/MainActivity.java | 6 ++++++ .../src/main/java/com/mogo/module/map/MapFragment.java | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java index e23dc28f2f..7e1b136d68 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java @@ -182,6 +182,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme EventDispatchCenter.getInstance().setMapLoadedCallback( () -> { Logger.d( TAG, "map loaded." + Thread.currentThread().getName() ); resetMapCenterPoint(); + resetMapUiStyle(); loadOthersModules(); Log.i( "timer", "cost " + ( System.currentTimeMillis() - start ) + "ms" ); } ); @@ -203,6 +204,11 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme } + private void resetMapUiStyle(){ + final EnumMapUI mapUI = MogoApisHandler.getInstance().getApis().getAdasControllerApi().getCurrentSkinMode(); + mServiceApis.getMapServiceApi().getMapUIController().changeMapMode( mapUI ); + } + private void resetMapCenterPoint() { // 右移地图中心点 MapCenterPointStrategy.init(); diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java index 626d665366..9940ca26a2 100644 --- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java @@ -154,10 +154,6 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements if ( mMogoMap.getUIController() != null ) { mMogoMap.getUIController().changeMapMode( EnumMapUI.CarUp_2D ); } - - - final EnumMapUI mapUI = MogoApisHandler.getInstance().getApis().getAdasControllerApi().getCurrentSkinMode(); - getUIController().changeMapMode( mapUI ); } } From d631c8c823f16e12439f7c88f3a0b374ab7aab3d Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Tue, 29 Dec 2020 16:16:52 +0800 Subject: [PATCH 02/51] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=AD=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/module/service/MogoServices.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index bcfe822ff2..59406a8a9a 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -933,10 +933,12 @@ public class MogoServices implements IMogoMapListener, MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode( TAG, true ); MapCenterPointStrategy.resetByChangeMode(); MapMarkerManager.getInstance().redrawMarkerByStyleChanged(); + AIAssist.getInstance( mContext ).speakTTSVoice( "你已进入鹰眼模式" ); } else { MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode( TAG, false ); MapCenterPointStrategy.resetByChangeMode(); MapMarkerManager.getInstance().redrawMarkerByStyleChanged(); + AIAssist.getInstance( mContext ).speakTTSVoice( "你已离开鹰眼模式" ); } } } From b66ec1da6d10c610ea89d201444787377c2749a4 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Tue, 29 Dec 2020 16:43:18 +0800 Subject: [PATCH 03/51] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=B0=E6=9C=80=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/map-custom/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/map-custom/build.gradle b/libraries/map-custom/build.gradle index b4e3a6729c..f355e8380f 100644 --- a/libraries/map-custom/build.gradle +++ b/libraries/map-custom/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation project(':foudations:mogo-commons') } - implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.5.3' + implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.5.4' // implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.4.5-log-1' } From 6257b7f79a6e9f6f1a80910995647540344a7547 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Tue, 29 Dec 2020 18:04:31 +0800 Subject: [PATCH 04/51] opt ui --- .../res/drawable/module_media_circle_bg.xml | 9 +++ ...le_media_music_window_alert_layout_new.xml | 56 ++++++++++++------- 2 files changed, 44 insertions(+), 21 deletions(-) create mode 100644 modules/mogo-module-media/src/main/res/drawable/module_media_circle_bg.xml diff --git a/modules/mogo-module-media/src/main/res/drawable/module_media_circle_bg.xml b/modules/mogo-module-media/src/main/res/drawable/module_media_circle_bg.xml new file mode 100644 index 0000000000..4f0286a260 --- /dev/null +++ b/modules/mogo-module-media/src/main/res/drawable/module_media_circle_bg.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/modules/mogo-module-media/src/main/res/layout/module_media_music_window_alert_layout_new.xml b/modules/mogo-module-media/src/main/res/layout/module_media_music_window_alert_layout_new.xml index 2469ea2ba7..9002881140 100644 --- a/modules/mogo-module-media/src/main/res/layout/module_media_music_window_alert_layout_new.xml +++ b/modules/mogo-module-media/src/main/res/layout/module_media_music_window_alert_layout_new.xml @@ -7,45 +7,59 @@ - + app:layout_constraintTop_toTopOf="parent" /> + - - - - - - - - + + + + + + + + - + app:layout_constraintTop_toTopOf="parent"> + + + + + From cab2517b1c523a9ca8fd282c92b1015e37c8bf0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Tue, 29 Dec 2020 18:44:01 +0800 Subject: [PATCH 05/51] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=8D=A2=E8=82=A4?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E4=B8=8E=E9=AB=98=E5=BE=B7=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E7=9A=84=E5=86=B2=E7=AA=81=20=E7=9B=B4=E6=8E=A5=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=86=85=E5=AD=98=E5=9C=B0=E5=9D=80=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=95=B4=E4=B8=AA=20ArtMethod=20=EF=BC=8C=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E4=BA=86=E9=AB=98=E5=BE=B7=E5=9C=B0=E5=9B=BE=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E7=9A=84=E6=9B=BF=E6=8D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 1 - .idea/misc.xml | 6 +- modules/mogo-module-common/CMakeLists.txt | 44 +++++ modules/mogo-module-common/build.gradle | 12 +- .../src/main/cpp/method-hook-lib.cpp | 87 ++++++++ .../mogo/module/common/hook/HookManager.java | 67 +++++++ .../mogo/module/common/hook/MethodHook.java | 64 ++++++ .../src/main/AndroidManifest.xml | 6 +- .../main/java/com/amap/api/col/n3/le2.java | 186 ++++++++++++++++++ .../main/java/com/amap/api/col/n3/lg2.java | 40 ++++ .../policy/MyPhoneLayoutInflater.java | 60 ++++++ .../module/small/map/SmallVisionProvider.java | 70 ++++++- 12 files changed, 628 insertions(+), 15 deletions(-) create mode 100644 modules/mogo-module-common/CMakeLists.txt create mode 100644 modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java create mode 100644 modules/mogo-module-smp/src/main/java/com/amap/api/col/n3/le2.java create mode 100644 modules/mogo-module-smp/src/main/java/com/amap/api/col/n3/lg2.java create mode 100644 modules/mogo-module-smp/src/main/java/com/android/internal/policy/MyPhoneLayoutInflater.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 8efbfa420e..426ff6b360 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -85,7 +85,6 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index e082ea7475..733acb1920 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,10 +1,14 @@ + + + + - + \ No newline at end of file diff --git a/modules/mogo-module-common/CMakeLists.txt b/modules/mogo-module-common/CMakeLists.txt new file mode 100644 index 0000000000..e66e013af7 --- /dev/null +++ b/modules/mogo-module-common/CMakeLists.txt @@ -0,0 +1,44 @@ +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. + +cmake_minimum_required(VERSION 3.4.1) + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. + +add_library( # Sets the name of the library. + method-hook-lib + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + src/main/cpp/method-hook-lib.cpp ) + +# Searches for a specified prebuilt library and stores the path as a +# variable. Because CMake includes system libraries in the search path by +# default, you only need to specify the name of the public NDK library +# you want to add. CMake verifies that the library exists before +# completing its build. + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log ) + +# Specifies libraries CMake should link to your target library. You +# can link multiple libraries, such as libraries you define in this +# build script, prebuilt third-party libraries, or system libraries. + +target_link_libraries( # Specifies the target library. + method-hook-lib + + # Links the target library to the log library + # included in the NDK. + ${log-lib} ) \ No newline at end of file diff --git a/modules/mogo-module-common/build.gradle b/modules/mogo-module-common/build.gradle index 99e827b866..783a180702 100644 --- a/modules/mogo-module-common/build.gradle +++ b/modules/mogo-module-common/build.gradle @@ -11,8 +11,18 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' - } + externalNativeBuild { + cmake { + cppFlags "-std=c++11 -frtti -fexceptions" + } + } + } + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } buildTypes { release { minifyEnabled false diff --git a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp b/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp new file mode 100644 index 0000000000..046981c7f2 --- /dev/null +++ b/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp @@ -0,0 +1,87 @@ +#include +#include + +// +// Created by donghongyu on 12/10/20 1:34 PM. +// 源码地址 https://github.com/pqpo/methodhook +// 方法hook jni类 +static const char *kClassMethodHookChar = "com/mogo/module/common/hook/MethodHook"; + +static struct { + jmethodID m1; + jmethodID m2; + size_t methodSize; +} methodHookClassInfo; + + +/** + * 替换指定类中的方法 + * @param env + * @param type 要替换方法的目标 class + * @param srcMethodObj 目标方法对象 + * @param destMethodObj 替换的方法对象 + * @return + */ +static jlong methodHook(JNIEnv *env, jclass type, jobject srcMethodObj, jobject destMethodObj) { + void *srcMethod = reinterpret_cast(env->FromReflectedMethod(srcMethodObj)); + void *destMethod = reinterpret_cast(env->FromReflectedMethod(destMethodObj)); + int *backupMethod = new int[methodHookClassInfo.methodSize]; + memcpy(backupMethod, srcMethod, methodHookClassInfo.methodSize); + memcpy(srcMethod, destMethod, methodHookClassInfo.methodSize); + return reinterpret_cast(backupMethod); +} + +/** + * 恢复指定类中的方法 + * @param env + * @param type 要恢复方法的目标 class + * @param srcMethod 目标方法对象 + * @param methodPtr + * @return + */ +static jobject methodRestore(JNIEnv *env, jclass type, jobject srcMethod, jlong methodPtr) { + int *backupMethod = reinterpret_cast(methodPtr); + void *artMethodSrc = reinterpret_cast(env->FromReflectedMethod(srcMethod)); + memcpy(artMethodSrc, backupMethod, methodHookClassInfo.methodSize); + delete[]backupMethod; + return srcMethod; +} + + +static JNINativeMethod gMethods[] = { + { + "hook_native", + "(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)J", + (void *) methodHook + }, + { + "restore_native", + "(Ljava/lang/reflect/Method;J)Ljava/lang/reflect/Method;", + (void *) methodRestore + } +}; + +extern "C" +JNIEXPORT jint JNICALL +/** + * 在jni加载的时候进行方法参数获取 + * @param vm + * @param reserved + * @return + */ +JNI_OnLoad(JavaVM *vm, void *reserved) { + JNIEnv *env = nullptr; + if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) { + return JNI_FALSE; + } + jclass classEvaluateUtil = env->FindClass(kClassMethodHookChar); + if (env->RegisterNatives(classEvaluateUtil, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < + 0) { + return JNI_FALSE; + } + methodHookClassInfo.m1 = env->GetStaticMethodID(classEvaluateUtil, "m1", "()V"); + methodHookClassInfo.m2 = env->GetStaticMethodID(classEvaluateUtil, "m2", "()V"); + methodHookClassInfo.methodSize = reinterpret_cast(methodHookClassInfo.m2) - + reinterpret_cast(methodHookClassInfo.m1); + return JNI_VERSION_1_4; +} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java new file mode 100644 index 0000000000..6dc15753b1 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java @@ -0,0 +1,67 @@ +package com.mogo.module.common.hook; + + +import android.util.Pair; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 替换管理 + * Created by donghongyu on 12/29/20 1:34 PM + */ +public final class HookManager { + + private HookManager() { + } + + public static HookManager get() { + return InstanceHolder.sInstance; + } + + private static class InstanceHolder { + private static HookManager sInstance = new HookManager(); + } + + private Map, MethodHook> methodHookMap = new ConcurrentHashMap<>(); + + /** + * 替换方法 + * + * @param originMethod 原始方法 + * @param hookMethod 替换方法 + */ + public void hookMethod(Method originMethod, Method hookMethod) { + if (originMethod == null || hookMethod == null) { + throw new IllegalArgumentException("argument cannot be null"); + } + + Pair key = Pair.create(hookMethod.getDeclaringClass().getName(), hookMethod.getName()); + if (methodHookMap.containsKey(key)) { + MethodHook methodHook = methodHookMap.get(key); + methodHook.restore(); + } + MethodHook methodHook = new MethodHook(originMethod, hookMethod); + methodHookMap.put(key, methodHook); + methodHook.hook(); + } + + public void callOrigin(Object receiver, Object... args) { + StackTraceElement stackTrace = Thread.currentThread().getStackTrace()[3]; + String className = stackTrace.getClassName(); + String methodName = stackTrace.getMethodName(); + MethodHook methodHook = methodHookMap.get(Pair.create(className, methodName)); + if (methodHook != null) { + try { + methodHook.callOrigin(receiver, args); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java new file mode 100644 index 0000000000..e63cf11392 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java @@ -0,0 +1,64 @@ +package com.mogo.module.common.hook; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 替换类与c++代码对应 + * Created by donghongyu on 12/29/20 1:34 PM + */ +public class MethodHook { + + public static void m1() { + } + + public static void m2() { + } + + // 目标方法 + private Method srcMethod; + // 要替换的方法 + private Method hookMethod; + + // 备份目标替换方法ID + private long backupMethodPtr; + + public MethodHook(Method src, Method dest) { + srcMethod = src; + hookMethod = dest; + srcMethod.setAccessible(true); + hookMethod.setAccessible(true); + } + + public void hook() { + if (backupMethodPtr == 0) { + backupMethodPtr = hook_native(srcMethod, hookMethod); + } + } + + public void restore() { + if (backupMethodPtr != 0) { + restore_native(srcMethod, backupMethodPtr); + backupMethodPtr = 0; + } + } + + public void callOrigin(Object receiver, Object... args) throws InvocationTargetException, IllegalAccessException { + if (backupMethodPtr != 0) { + restore(); + srcMethod.invoke(receiver, args); + hook(); + } else { + srcMethod.invoke(receiver, args); + } + } + + private static native long hook_native(Method src, Method dest); + + private static native Method restore_native(Method src, long methodPtr); + + static { + System.loadLibrary("method-hook-lib"); + } + +} diff --git a/modules/mogo-module-smp/src/main/AndroidManifest.xml b/modules/mogo-module-smp/src/main/AndroidManifest.xml index 32b078729c..33c6adff88 100644 --- a/modules/mogo-module-smp/src/main/AndroidManifest.xml +++ b/modules/mogo-module-smp/src/main/AndroidManifest.xml @@ -2,10 +2,10 @@ - + \ No newline at end of file diff --git a/modules/mogo-module-smp/src/main/java/com/amap/api/col/n3/le2.java b/modules/mogo-module-smp/src/main/java/com/amap/api/col/n3/le2.java new file mode 100644 index 0000000000..cd406be8a7 --- /dev/null +++ b/modules/mogo-module-smp/src/main/java/com/amap/api/col/n3/le2.java @@ -0,0 +1,186 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package com.amap.api.col.n3; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.Resources.Theme; +import android.util.AttributeSet; +import android.util.Log; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; +import android.view.LayoutInflater.Factory; +import android.view.View; +import android.view.ViewStub; + +import com.android.internal.policy.MyPhoneLayoutInflater; + +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.HashSet; + +public final class le2 extends ContextThemeWrapper { + private Resources a = lg.a(); + private Theme b; + private LayoutInflater c; + private ClassLoader d; + private int e; + private static final String[] f = new String[]{"android.widget", "android.webkit", "android.app"}; + private le2.a g = new le2.a(); + private Factory h = new Factory() { + public final View onCreateView(String var1, Context var2, AttributeSet var3) { + return le2.this.a(var1, var2, var3); + } + }; + + public le2(Context var1, int var2, ClassLoader var3) { + super(var1, var2); + this.d = var3; + this.b = lg.b(); + this.e = var2; + super.onApplyThemeResource(this.b, this.e, true); + (new StringBuilder("classloader:")).append(this.d); + } + + public final Resources getResources() { + return this.a != null ? this.a : super.getResources(); + } + + public final void a(int var1) { + if (var1 != this.e) { + this.e = var1; + super.onApplyThemeResource(this.b, this.e, true); + } + + } + + public final Theme getTheme() { + return this.b != null ? this.b : super.getTheme(); + } + + public final Object getSystemService(String var1) { + if ("layout_inflater".equals(var1)) { + if (this.c == null) { + // 这里构建一个自己对的布局填充器 + // 与已经被修改的context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) + // 隔离从而保证高德地图SDK能正常初始化 + LayoutInflater var2 = new MyPhoneLayoutInflater(getBaseContext()); + this.c = var2.cloneInContext(this); + this.c.setFactory(this.h); + this.c = this.c.cloneInContext(this); + } + + return this.c; + } else { + return super.getSystemService(var1); + } + } + + private final View a(String var1, Context var2, AttributeSet var3) { + if (this.g.a.contains(var1)) { + return null; + } else { + Constructor var4; + if ((var4 = (Constructor) this.g.b.get(var1)) == null) { + Class var5 = null; + boolean var6 = false; + String var7 = "api.navi"; + + label71: + { + label70: + { + Throwable var10000; + label79: + { + boolean var10001; + try { + if (var1.contains(var7)) { + var5 = this.d.loadClass(var1); + } else { + String[] var17; + int var8 = (var17 = f).length; + int var9 = 0; + + while (var9 < var8) { + String var10 = var17[var9]; + + try { + var5 = this.d.loadClass(var10 + "." + var1); + break; + } catch (Throwable var13) { + ++var9; + } + } + } + + if (var5 == null) { + break label71; + } + } catch (Throwable var15) { + var10000 = var15; + var10001 = false; + break label79; + } + + if (var5 == ViewStub.class) { + break label71; + } + + try { + if (var5.getClassLoader() != this.d) { + break label71; + } + break label70; + } catch (Throwable var14) { + var10000 = var14; + var10001 = false; + } + } + + Throwable var18 = var10000; + (new StringBuilder("load view err:")).append(Log.getStackTraceString(var18)); + break label71; + } + + var6 = true; + } + + if (!var6) { + this.g.a.add(var1); + return null; + } + + try { + var4 = var5.getConstructor(Context.class, AttributeSet.class); + this.g.b.put(var1, var4); + } catch (Throwable var12) { + (new StringBuilder("create view err:")).append(Log.getStackTraceString(var12)); + } + } + + try { + View var16 = null; + if (var4 != null) { + var16 = (View) var4.newInstance(var2, var3); + } + + return var16; + } catch (Throwable var11) { + (new StringBuilder("create view err:")).append(Log.getStackTraceString(var11)); + return null; + } + } + } + + public static class a { + public HashSet a = new HashSet(); + public HashMap> b = new HashMap(); + + public a() { + } + } +} diff --git a/modules/mogo-module-smp/src/main/java/com/amap/api/col/n3/lg2.java b/modules/mogo-module-smp/src/main/java/com/amap/api/col/n3/lg2.java new file mode 100644 index 0000000000..347f98ddc6 --- /dev/null +++ b/modules/mogo-module-smp/src/main/java/com/amap/api/col/n3/lg2.java @@ -0,0 +1,40 @@ +package com.amap.api.col.n3; + +import android.content.Context; +import android.content.res.XmlResourceParser; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * 这里是为了解决 使用换肤框架后,高德地图初始化有问题加入的 + * 问题原因是: + * skin 框架会替换 LayoutInflater 中的 setFactory2 从而导致高德 le 中的 setFactory 失效。 + * 解决方案为: + * 直接通过内存地址替换整个 ArtMethod,来将需要修改的高德SDK中的方法指向我们修改过后的方法。 + */ +public class lg2 extends lg { + static le2 b; + + public static View a(Context var0, int var1, ViewGroup var2) { + XmlResourceParser var9 = a().getXml(var1); + if (!a) { + return LayoutInflater.from(var0).inflate(var9, var2); + } else { + try { + if (b == null) { + b = new le2(var0, c == -1 ? 0 : c, lg.class.getClassLoader()); + } + b.a(c == -1 ? 0 : c); + View var3 = LayoutInflater.from(b).inflate(var9, var2); + return var3; + } catch (Throwable var7) { + var7.printStackTrace(); + np.c(var7, "ResourcesUtil", "selfInflate(Activity activity, int resource, ViewGroup root)"); + } finally { + var9.close(); + } + return null; + } + } +} diff --git a/modules/mogo-module-smp/src/main/java/com/android/internal/policy/MyPhoneLayoutInflater.java b/modules/mogo-module-smp/src/main/java/com/android/internal/policy/MyPhoneLayoutInflater.java new file mode 100644 index 0000000000..4a2d262764 --- /dev/null +++ b/modules/mogo-module-smp/src/main/java/com/android/internal/policy/MyPhoneLayoutInflater.java @@ -0,0 +1,60 @@ +package com.android.internal.policy; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; + +/** + * @author donghongyu + * @date 12/25/20 5:12 PM + */ +public class MyPhoneLayoutInflater extends LayoutInflater { + private static final String[] sClassPrefixList = { + "android.widget.", + "android.webkit.", + "android.app." + }; + + /** + * Instead of instantiating directly, you should retrieve an instance + * through {@link Context#getSystemService} + * + * @param context The Context in which in which to find resources and other + * application-specific things. + * @see Context#getSystemService + */ + public MyPhoneLayoutInflater(Context context) { + super(context); + } + + protected MyPhoneLayoutInflater(LayoutInflater original, Context newContext) { + super(original, newContext); + } + + /** + * Override onCreateView to instantiate names that correspond to the + * widgets known to the Widget factory. If we don't find a match, + * call through to our super class. + */ + @Override + protected View onCreateView(String name, AttributeSet attrs) throws ClassNotFoundException { + for (String prefix : sClassPrefixList) { + try { + View view = createView(name, prefix, attrs); + if (view != null) { + return view; + } + } catch (ClassNotFoundException e) { + // In this case we want to let the base class take a crack + // at it. + } + } + + return super.onCreateView(name, attrs); + } + + public LayoutInflater cloneInContext(Context newContext) { + return new MyPhoneLayoutInflater(this, newContext); + } +} \ No newline at end of file diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java index 10fb9139b9..258bce4688 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java @@ -1,22 +1,30 @@ package com.mogo.module.small.map; import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.util.Log; +import android.view.Gravity; import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import com.alibaba.android.arouter.facade.annotation.Route; -import com.mogo.commons.AbsMogoApplication; +import com.amap.api.col.n3.lg; +import com.amap.api.col.n3.lg2; import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.hook.HookManager; +import com.mogo.module.common.wm.WindowManagerView; import com.mogo.service.MogoServicePaths; import com.mogo.service.map.IMogoSmallMapProvider; import com.mogo.service.module.ModuleType; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; +import com.mogo.utils.logger.Logger; + +import java.lang.reflect.Method; /** * @author donghongyu @@ -26,9 +34,11 @@ import com.mogo.service.statusmanager.StatusDescriptor; public class SmallVisionProvider implements IMogoSmallMapProvider, IMogoStatusChangedListener { private final String TAG = "SmallVisionProvider"; - private Intent mSmallMapServiceIntent; private Context mContext; + private WindowManagerView mWindowManagerView; + private SmallMapDirectionView mSmallMapDirectionView; + @Override public Fragment createFragment(Context context, Bundle data) { return null; @@ -55,6 +65,19 @@ public class SmallVisionProvider implements IMogoSmallMapProvider, IMogoStatusCh Log.d(TAG, "小地图模块初始化……"); mContext = context; + try { + try { + // 替换高德地图的方法,解决因为加入换肤框架导致地图初始化失败 + Method srcMethod = lg.class.getDeclaredMethod("a", Context.class, int.class, ViewGroup.class); + Method destMethod = lg2.class.getDeclaredMethod("a", Context.class, int.class, ViewGroup.class); + HookManager.get().hookMethod(srcMethod, destMethod); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + MogoApisHandler.getInstance() .getApis() .getStatusManagerApi() @@ -76,22 +99,22 @@ public class SmallVisionProvider implements IMogoSmallMapProvider, IMogoStatusCh public void onDestroy() { Log.d(TAG, "小地图模块销毁……"); hidePanel(); + // 释放组件内存 + mSmallMapDirectionView = null; + mWindowManagerView = null; } @Override public void showPanel() { Log.d(TAG, "小地图模块触发展示……"); - if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { - mSmallMapServiceIntent = new Intent(mContext, SmallMapService.class); - mContext.startService(mSmallMapServiceIntent); - } + addSmallMapView(); } @Override public void hidePanel() { Log.d(TAG, "小地图模块触发隐藏……"); - if (mSmallMapServiceIntent != null) { - AbsMogoApplication.getApp().stopService(mSmallMapServiceIntent); + if (mWindowManagerView != null && mWindowManagerView.isShowing()) { + mWindowManagerView.dismiss(); } } @@ -122,4 +145,33 @@ public class SmallVisionProvider implements IMogoSmallMapProvider, IMogoStatusCh } } } + + + /** + * 添加小地图View + */ + private void addSmallMapView() { + Logger.d(TAG, "addSmallMapView"); + // 初始化小地图控件 + if (mSmallMapDirectionView == null) { + mSmallMapDirectionView = new SmallMapDirectionView(mContext); + } + + if (mWindowManagerView == null) { + mWindowManagerView = new WindowManagerView.Builder(mContext) + .contentView(mSmallMapDirectionView) + .size( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT + ) + .position( + mContext.getResources().getDimensionPixelOffset(R.dimen.module_small_map_view_x), + mContext.getResources().getDimensionPixelOffset(R.dimen.module_small_map_view_y) + ) + .gravity(Gravity.TOP | Gravity.LEFT) + .showInWindowManager(); + } + mWindowManagerView.show(); + } + } From dff433ee65f9406ee2fec47ee55db3cae70c7703 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Tue, 29 Dec 2020 19:07:26 +0800 Subject: [PATCH 06/51] =?UTF-8?q?=E6=9B=BF=E6=8D=A2ViewUtils.fromView?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 1 + .../src/main/java/com/mogo/utils/ViewUtils.java | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 426ff6b360..8efbfa420e 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -85,6 +85,7 @@ diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/ViewUtils.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/ViewUtils.java index dfd92bd7e1..195de14f7c 100644 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/ViewUtils.java +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/ViewUtils.java @@ -20,11 +20,12 @@ public class ViewUtils { view.destroyDrawingCache(); view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); - Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas( bitmap ); - view.draw( canvas ); - return bitmap; -// return (bitmap = view.getDrawingCache()) != null ? bitmap.copy(Bitmap.Config.ARGB_8888, false) : null; +// Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); +// Canvas canvas = new Canvas( bitmap ); +// view.draw( canvas ); +// return bitmap; + Bitmap bitmap = null; + return (bitmap = view.getDrawingCache()) != null ? bitmap.copy(Bitmap.Config.ARGB_8888, false) : null; } public static void processChildView(View view) { From 4d02918698d4421bb92c0b09c6b7b36492900289 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 29 Dec 2020 19:20:49 +0800 Subject: [PATCH 07/51] fix UI bug and replace retrofit of callchat --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 02f2b63fe2..49db55f727 100644 --- a/gradle.properties +++ b/gradle.properties @@ -139,7 +139,7 @@ HTTPDNS_NOOP_VERSION = 2.0.12 ######## 外部依赖引用 # 车聊聊 -CARCHATTING_VERSION=2.2.42 +CARCHATTING_VERSION=2.2.50 # 车聊聊接口 CARCHATTINGPROVIDER_VERSION=1.1.8 # websocket From 1111e61f2faf8cce16a2d6f17c359de8f09bd45a Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Tue, 29 Dec 2020 19:27:16 +0800 Subject: [PATCH 08/51] opt --- .../java/com/zhidao/roadcondition/constant/HttpConstants.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tanlulib/src/main/java/com/zhidao/roadcondition/constant/HttpConstants.kt b/libraries/tanlulib/src/main/java/com/zhidao/roadcondition/constant/HttpConstants.kt index 9778b0b1c2..dd539098ab 100644 --- a/libraries/tanlulib/src/main/java/com/zhidao/roadcondition/constant/HttpConstants.kt +++ b/libraries/tanlulib/src/main/java/com/zhidao/roadcondition/constant/HttpConstants.kt @@ -7,7 +7,7 @@ class HttpConstants { companion object { const val DEV_BASE_URL_OWNER = "http://dzt-test.zhidaozhixing.com/" - const val RELEASE_BASE_URL_OWNER = "http://dzt.zhidaohulian.com/" + const val RELEASE_BASE_URL_OWNER = "http://dzt.zhidaozhixing.com/" const val SHOW_BASE_URL_OWNER = "http://dzt-show.zhidaozhixing.com/" fun getBaseUrl(): String { From 01afc151d9c43109267d591c4d35ee52d25e24e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Tue, 29 Dec 2020 19:50:33 +0800 Subject: [PATCH 09/51] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86api=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/cpp/method-hook-lib.cpp | 21 ++++++++-- .../mogo/module/common/hook/MethodHook.java | 38 ++++++++++++++++++- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp b/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp index 046981c7f2..dd5111ea23 100644 --- a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp +++ b/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp @@ -17,37 +17,48 @@ static struct { /** * 替换指定类中的方法 * @param env - * @param type 要替换方法的目标 class + * @param type * @param srcMethodObj 目标方法对象 * @param destMethodObj 替换的方法对象 * @return */ static jlong methodHook(JNIEnv *env, jclass type, jobject srcMethodObj, jobject destMethodObj) { + // 反射:获取了Java对象的在native层的 ArtMethod指针 void *srcMethod = reinterpret_cast(env->FromReflectedMethod(srcMethodObj)); void *destMethod = reinterpret_cast(env->FromReflectedMethod(destMethodObj)); + // 定义存储方法ID的数组 int *backupMethod = new int[methodHookClassInfo.methodSize]; + // 使用的内存拷贝函数 + // 将旧方法ID拷贝到数组中 memcpy(backupMethod, srcMethod, methodHookClassInfo.methodSize); + // 将新方法替换到旧方法地址上 memcpy(srcMethod, destMethod, methodHookClassInfo.methodSize); + // 将旧方法ID返回给java层,用来做方法还原使用 return reinterpret_cast(backupMethod); } /** * 恢复指定类中的方法 * @param env - * @param type 要恢复方法的目标 class + * @param type * @param srcMethod 目标方法对象 * @param methodPtr * @return */ static jobject methodRestore(JNIEnv *env, jclass type, jobject srcMethod, jlong methodPtr) { + // 要还原的旧方法 指针 int *backupMethod = reinterpret_cast(methodPtr); + // 获取了Java对象的在native层的 ArtMethod指针 void *artMethodSrc = reinterpret_cast(env->FromReflectedMethod(srcMethod)); + // 将旧方法指针,替换到 artMethodSrc 中 memcpy(artMethodSrc, backupMethod, methodHookClassInfo.methodSize); + // 删除旧方法备份指针 delete[]backupMethod; + // 返回旧方法 return srcMethod; } - +// 定义要注册的方法 static JNINativeMethod gMethods[] = { { "hook_native", @@ -74,13 +85,17 @@ JNI_OnLoad(JavaVM *vm, void *reserved) { if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) { return JNI_FALSE; } + // 加载指定java class jclass classEvaluateUtil = env->FindClass(kClassMethodHookChar); + // 注册 if (env->RegisterNatives(classEvaluateUtil, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) { return JNI_FALSE; } + // 获取 MethodHook m1、m2 的方法ID methodHookClassInfo.m1 = env->GetStaticMethodID(classEvaluateUtil, "m1", "()V"); methodHookClassInfo.m2 = env->GetStaticMethodID(classEvaluateUtil, "m2", "()V"); + // 获取artMethod的大小, methodHookClassInfo.methodSize = reinterpret_cast(methodHookClassInfo.m2) - reinterpret_cast(methodHookClassInfo.m1); return JNI_VERSION_1_4; diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java index e63cf11392..8586ac1adc 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java @@ -23,6 +23,12 @@ public class MethodHook { // 备份目标替换方法ID private long backupMethodPtr; + /** + * hook方法 + * + * @param src 要替换的方法对象 + * @param dest 被替换的方法对象 + */ public MethodHook(Method src, Method dest) { srcMethod = src; hookMethod = dest; @@ -30,12 +36,18 @@ public class MethodHook { hookMethod.setAccessible(true); } + /** + * 调用 native 层,完成替换 + */ public void hook() { if (backupMethodPtr == 0) { backupMethodPtr = hook_native(srcMethod, hookMethod); } } + /** + * 调用 native 层,完成方法还原 + */ public void restore() { if (backupMethodPtr != 0) { restore_native(srcMethod, backupMethodPtr); @@ -43,7 +55,16 @@ public class MethodHook { } } - public void callOrigin(Object receiver, Object... args) throws InvocationTargetException, IllegalAccessException { + /** + * 调用原来class 对象中的方法 + * + * @param receiver 接受对象 + * @param args 方法列表 + * @throws InvocationTargetException + * @throws IllegalAccessException + */ + public void callOrigin(Object receiver, Object... args) + throws InvocationTargetException, IllegalAccessException { if (backupMethodPtr != 0) { restore(); srcMethod.invoke(receiver, args); @@ -53,11 +74,26 @@ public class MethodHook { } } + /** + * 调用 native 方法完成 方法替换 + * + * @param src 旧方法 + * @param dest 新方法 + * @return 就方法ID + */ private static native long hook_native(Method src, Method dest); + /** + * 调用 native 方法完成 方法还原 + * + * @param src + * @param methodPtr + * @return + */ private static native Method restore_native(Method src, long methodPtr); static { + // 加载本地方法 so System.loadLibrary("method-hook-lib"); } From d352e5ee1fee35e645369cdd2fc1dea6a960dc52 Mon Sep 17 00:00:00 2001 From: wujifei Date: Tue, 29 Dec 2020 20:59:49 +0800 Subject: [PATCH 10/51] =?UTF-8?q?new#=E5=9F=BA=E4=BA=8E=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E9=A2=84=E5=88=A4=E7=9A=84=E9=81=93=E8=B7=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E9=86=92=E3=80=81=E8=B7=AF=E7=BA=BF=E6=8E=A8?= =?UTF-8?q?=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/entity/V2XEventShowEntity.java | 17 +++- .../common/entity/V2XMessageEntity.java | 6 +- ...tity.java => V2XRecommendRouteEntity.java} | 2 +- .../v2x/adapter/V2XRoadEventAdapter.java | 5 + .../adapter/holder/V2XRecommendRouteVH.java | 36 +++++++ .../module/v2x/network/V2XRefreshModel.java | 20 ++-- .../v2x/scenario/impl/V2XScenarioManager.java | 6 +- .../V2XPrejectedRoadEventScenario.kt | 64 ------------ .../V2XPrejectedRoadEventWindow.kt | 71 -------------- .../destination/V2XRecommendRouteScenario.kt | 98 +++++++++++++++++++ .../destination/V2XRecommendRouteWindow.kt | 87 ++++++++++++++++ .../scene/test/V2XTestConsoleWindow.java | 2 +- .../res/layout/item_v2x_recommend_route.xml | 89 +++++++++++++++++ 13 files changed, 345 insertions(+), 158 deletions(-) rename modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/{V2XPrejectedRoadEventEntity.java => V2XRecommendRouteEntity.java} (76%) create mode 100644 modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java delete mode 100644 modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XPrejectedRoadEventScenario.kt delete mode 100644 modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XPrejectedRoadEventWindow.kt create mode 100644 modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt create mode 100644 modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteWindow.kt create mode 100644 modules/mogo-module-v2x/src/main/res/layout/item_v2x_recommend_route.xml diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XEventShowEntity.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XEventShowEntity.java index 4b6d621d60..636e4ea87a 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XEventShowEntity.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XEventShowEntity.java @@ -35,6 +35,9 @@ public class V2XEventShowEntity implements Serializable { // 违章停车 private MarkerExploreWay v2XIllegalPark; + // 基于目的地道路推荐详情 + private V2XRecommendRouteEntity v2XRecommendRouteEntity; + public int getViewType() { return viewType; } @@ -83,6 +86,14 @@ public class V2XEventShowEntity implements Serializable { this.v2XIllegalPark = v2XIllegalPark; } + public V2XRecommendRouteEntity getV2XRecommendRouteEntity() { + return v2XRecommendRouteEntity; + } + + public void setV2XRecommendRouteEntity(V2XRecommendRouteEntity v2XRecommendRouteEntity) { + this.v2XRecommendRouteEntity = v2XRecommendRouteEntity; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -97,14 +108,15 @@ public class V2XEventShowEntity implements Serializable { Objects.equals(v2XLiveCarInfoRes, that.v2XLiveCarInfoRes) && Objects.equals(v2XLiveCarList, that.v2XLiveCarList) && Objects.equals(v2XPushMessageEntity, that.v2XPushMessageEntity) && - Objects.equals(v2XIllegalPark, that.v2XIllegalPark); + Objects.equals(v2XIllegalPark, that.v2XIllegalPark) && + Objects.equals(v2XRecommendRouteEntity, that.v2XRecommendRouteEntity); } @Override public int hashCode() { return Objects.hash(viewType, v2XRoadEventEntity, v2XLiveCarInfoRes, v2XLiveCarList, - v2XPushMessageEntity, v2XIllegalPark); + v2XPushMessageEntity, v2XIllegalPark, v2XRecommendRouteEntity); } @@ -119,6 +131,7 @@ public class V2XEventShowEntity implements Serializable { V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_LIVE_CAR_WARNING, V2XMessageEntity.V2XTypeEnum.ALERT_ILLEGAL_PARK_WARNING, V2XMessageEntity.V2XTypeEnum.ALERT_CAR_FOR_HELP, + V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_ROUTE, }) @Target({ ElementType.PARAMETER, diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XMessageEntity.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XMessageEntity.java index 8019c7547b..f025292325 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XMessageEntity.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XMessageEntity.java @@ -141,8 +141,8 @@ public class V2XMessageEntity implements Serializable { int ALERT_EVENT_UGC_WARNING = 1_009; // 呼叫、请求直播事件 int ALERT_VOICE_CALL_FOR_LIVECAR_SHOW = 1_010; - // 基于目的地预判的道路事件 - int ALERT_PREJECTED_ROAD_WARNING = 1_011; + // 基于预判目的地道路事件的路线推荐 + int ALERT_RECOMMEND_ROUTE = 1_011; // 推送VR消息展示 int ALERT_PUSH_VR_SHOW = 2_000; // 自车求助 @@ -164,7 +164,7 @@ public class V2XMessageEntity implements Serializable { V2XTypeEnum.ALERT_EVENT_UGC_WARNING, V2XTypeEnum.ALERT_CAR_FOR_HELP, V2XTypeEnum.ALERT_VOICE_CALL_FOR_LIVECAR_SHOW, - V2XTypeEnum.ALERT_PREJECTED_ROAD_WARNING, + V2XTypeEnum.ALERT_RECOMMEND_ROUTE, V2XTypeEnum.ALERT_PUSH_VR_SHOW, V2XTypeEnum.ALERT_OBU_EVENT, }) diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XPrejectedRoadEventEntity.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java similarity index 76% rename from modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XPrejectedRoadEventEntity.java rename to modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java index 68733947a3..d95387b5f2 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XPrejectedRoadEventEntity.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java @@ -4,6 +4,6 @@ package com.mogo.module.common.entity; * created by wujifei on 2020/12/24 15:33 * describe:基于目的地预判的道路事件 */ -public class V2XPrejectedRoadEventEntity { +public class V2XRecommendRouteEntity { } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/V2XRoadEventAdapter.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/V2XRoadEventAdapter.java index 66dd23a818..b4a68452b2 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/V2XRoadEventAdapter.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/V2XRoadEventAdapter.java @@ -13,6 +13,7 @@ import com.mogo.module.v2x.adapter.holder.V2XIllegalParkVH; import com.mogo.module.v2x.adapter.holder.V2XLiveVideoVH; import com.mogo.module.v2x.adapter.holder.V2XOtherSeekHelpVH; import com.mogo.module.v2x.adapter.holder.V2XPushEventVH; +import com.mogo.module.v2x.adapter.holder.V2XRecommendRouteVH; import com.mogo.module.v2x.adapter.holder.V2XRoadEventVH; import com.mogo.module.v2x.scenario.view.IV2XWindow; @@ -70,6 +71,10 @@ public class V2XRoadEventAdapter extends RecyclerView.Adapter { + private TextView mTvAddress, mTvAddressDistance; + private ImageView mIvToNav, mIvClose; + + public V2XRecommendRouteVH(ViewGroup viewGroup, IV2XWindow v2XWindow) { + super(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_v2x_fatigue_driving, viewGroup, false), v2XWindow); + mTvAddress = itemView.findViewById(R.id.tvAddress); + mTvAddressDistance = itemView.findViewById(R.id.tvAddressDistance); + mIvToNav = itemView.findViewById(R.id.ivToNav); + mIvClose = itemView.findViewById(R.id.ivClose); + } + + @Override + public void initView(V2XRecommendRouteEntity viewData) { + + } +} diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java index eab482be1b..e1ea631bc9 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java @@ -16,13 +16,11 @@ import com.mogo.map.MogoLatLng; import com.mogo.map.location.MogoLocation; import com.mogo.module.common.entity.MarkerResponse; import com.mogo.module.common.entity.V2XMessageEntity; -import com.mogo.module.common.entity.V2XPrejectedRoadEventEntity; -import com.mogo.module.common.entity.V2XRoadEventEntity; +import com.mogo.module.common.entity.V2XRecommendRouteEntity; import com.mogo.module.service.ServiceConst; import com.mogo.module.service.network.RefreshBody; import com.mogo.module.v2x.V2XConst; import com.mogo.module.v2x.V2XServiceManager; -import com.mogo.module.v2x.alarm.V2XAlarmServer; import com.mogo.module.v2x.entity.net.V2XDemoUserInfoRes; import com.mogo.module.v2x.entity.net.V2XLiveCarBroadcastReq; import com.mogo.module.v2x.entity.net.V2XLiveCarRes; @@ -32,7 +30,6 @@ import com.mogo.module.v2x.entity.net.V2XRoadDataRes; import com.mogo.module.v2x.entity.net.V2XSeekHelpRes; import com.mogo.module.v2x.entity.net.V2XStrategyPushRes; import com.mogo.module.v2x.entity.net.V2XUserInfoRes; -import com.mogo.module.v2x.utils.TimeUtils; import com.mogo.module.v2x.utils.V2XUtils; import com.mogo.service.MogoServicePaths; import com.mogo.service.network.IMogoNetwork; @@ -42,15 +39,10 @@ import com.mogo.utils.network.utils.GsonUtil; import java.util.Map; -import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.annotations.NonNull; -import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.RequestBody; -import static com.mogo.module.v2x.V2XConst.MODULE_NAME; - /** * 数据接口API @@ -689,18 +681,20 @@ public class V2XRefreshModel { return; } if (v2XRoadDataRes.getResult().getPoiData() != null && v2XRoadDataRes.getResult().getPoiData().size() > 0) { - V2XPrejectedRoadEventEntity v2XPrejectedRoadEventEntity = new V2XPrejectedRoadEventEntity(); - V2XMessageEntity v2xMessageEntity = new V2XMessageEntity<>(); + V2XRecommendRouteEntity v2XRecommendRouteEntity = new V2XRecommendRouteEntity(); + V2XMessageEntity v2xMessageEntity = new V2XMessageEntity<>(); // 控制类型 - v2xMessageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_PREJECTED_ROAD_WARNING); + v2xMessageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_ROUTE); // 设置数据 - v2xMessageEntity.setContent(v2XPrejectedRoadEventEntity); + v2xMessageEntity.setContent(v2XRecommendRouteEntity); // 控制展示状态 v2xMessageEntity.setShowState(true); Intent intent = new Intent(V2XConst.BROADCAST_SCENE_HANDLER_ACTION); intent.putExtra(V2XConst.BROADCAST_SCENE_EXTRA_KEY, v2xMessageEntity); LocalBroadcastManager.getInstance(V2XUtils.getApp()).sendBroadcast(intent); + } else if (v2XRoadDataRes.getResult().getIllegalParkingData() != null && v2XRoadDataRes.getResult().getIllegalParkingData().size() > 0) { + } } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java index c33e5ab8d8..bbb5396928 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java @@ -9,7 +9,7 @@ import com.mogo.module.v2x.V2XConst; import com.mogo.module.v2x.V2XServiceManager; import com.mogo.module.v2x.scenario.IV2XScenarioManager; import com.mogo.module.v2x.scenario.scene.animation.V2XAnimationScenario; -import com.mogo.module.v2x.scenario.scene.destination.V2XPrejectedRoadEventScenario; +import com.mogo.module.v2x.scenario.scene.destination.V2XRecommendRouteScenario; import com.mogo.module.v2x.scenario.scene.fatigue.V2XFatigueDrivingScenario; import com.mogo.module.v2x.scenario.scene.help.V2XCarForHelpScenario; import com.mogo.module.v2x.scenario.scene.livecar.V2XPushLiveCarScenario; @@ -97,8 +97,8 @@ public class V2XScenarioManager implements IV2XScenarioManager { case V2XMessageEntity.V2XTypeEnum.ALERT_VOICE_CALL_FOR_LIVECAR_SHOW: mV2XScenario = new V2XVoiceCallLiveScenario(); break; - case V2XMessageEntity.V2XTypeEnum.ALERT_PREJECTED_ROAD_WARNING: - mV2XScenario = new V2XPrejectedRoadEventScenario(); + case V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_ROUTE: + mV2XScenario = new V2XRecommendRouteScenario(); break; case V2XMessageEntity.V2XTypeEnum.ALERT_PUSH_VR_SHOW: mV2XScenario = new V2XPushVREventScenario(); diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XPrejectedRoadEventScenario.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XPrejectedRoadEventScenario.kt deleted file mode 100644 index d741864f2a..0000000000 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XPrejectedRoadEventScenario.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.mogo.module.v2x.scenario.scene.destination - -import com.mogo.module.common.entity.V2XMessageEntity -import com.mogo.module.common.entity.V2XPrejectedRoadEventEntity -import com.mogo.module.v2x.scenario.impl.AbsV2XScenario - -/** - * created by wujifei on 2020/12/25 14:15 - * describe:基于目的地预判的道路事件场景 - */ -class V2XPrejectedRoadEventScenario : AbsV2XScenario() { - - init { - v2XWindow = V2XPrejectedRoadEventWindow() - } - - override fun init(v2XMessageEntity: V2XMessageEntity?) { - v2XMessageEntity?.content.let { - if (v2XMessageEntity!!.isShowState) { - if (!isSameScenario(v2XMessageEntity)) { - // 更新要提醒的数据 - setV2XMessageEntity(v2XMessageEntity) - show() - } else { - // 更新要提醒的数据 - setV2XMessageEntity(v2XMessageEntity) - } - } else { - close() - } - } - } - - - override fun show() { - TODO("Not yet implemented") - } - - override fun showWindow() { - TODO("Not yet implemented") - } - - override fun closeWindow() { - TODO("Not yet implemented") - } - - override fun showButton() { - TODO("Not yet implemented") - } - - override fun closeButton() { - TODO("Not yet implemented") - } - - override fun drawPOI() { - TODO("Not yet implemented") - } - - override fun clearPOI() { - TODO("Not yet implemented") - } - - -} \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XPrejectedRoadEventWindow.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XPrejectedRoadEventWindow.kt deleted file mode 100644 index 15100946aa..0000000000 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XPrejectedRoadEventWindow.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.mogo.module.v2x.scenario.scene.destination - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.ImageView -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.PagerSnapHelper -import androidx.recyclerview.widget.RecyclerView -import com.mogo.module.common.entity.V2XEventShowEntity -import com.mogo.module.common.entity.V2XRoadEventEntity -import com.mogo.module.v2x.R -import com.mogo.module.v2x.V2XServiceManager -import com.mogo.module.v2x.adapter.V2XRoadEventAdapter -import com.mogo.module.v2x.listener.V2XWindowStatusListener -import com.mogo.module.v2x.scenario.scene.V2XBasWindow -import com.mogo.module.v2x.scenario.view.IV2XWindow -import java.util.* - -/** - * created by wujifei on 2020/12/25 11:45 - * describe:基于目的地预判的道路事件场景弹窗 - */ -class V2XPrejectedRoadEventWindow @JvmOverloads constructor( - context: Context = V2XServiceManager.getContext(), - attrs: AttributeSet? = null, - defStyleAttr: Int = 0) : V2XBasWindow(context, attrs, defStyleAttr), IV2XWindow { - private var rvPrejectedRoadEventList: RecyclerView? = null - private var btnCloseWindow: ImageView? = null - - // 列表展示 - private val mItemList: List = ArrayList() - private var mV2XRoadEventAdapter: V2XRoadEventAdapter? = null - - init { - initView(context) - } - - private fun initView(context: Context) { - // 填充布局 - LayoutInflater.from(context).inflate(R.layout.window_prejected_road_event_detail, this) - rvPrejectedRoadEventList = findViewById(R.id.rvPrejectedRoadEventList) as RecyclerView - btnCloseWindow = findViewById(R.id.btnCloseWindow) as ImageView - btnCloseWindow!!.setOnClickListener { close() } - mV2XRoadEventAdapter = V2XRoadEventAdapter(mItemList, this) - rvPrejectedRoadEventList!!.adapter = mV2XRoadEventAdapter - // 设置切换样式 - PagerSnapHelper().attachToRecyclerView(rvPrejectedRoadEventList) - // 配置列表朝向 - val layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) - rvPrejectedRoadEventList!!.layoutManager = layoutManager - } - - - override fun close() { - //移除窗体 - V2XServiceManager.getMogoTopViewManager().removeView(this) - } - - override fun getView(): View { - return this - } - - override fun setWindowStatusListener(listener: V2XWindowStatusListener) {} - - - override fun show(entity: V2XRoadEventEntity?) { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt new file mode 100644 index 0000000000..e14165cb62 --- /dev/null +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt @@ -0,0 +1,98 @@ +package com.mogo.module.v2x.scenario.scene.destination + +import android.view.View +import android.view.ViewGroup +import com.mogo.module.common.entity.V2XMessageEntity +import com.mogo.module.common.entity.V2XRecommendRouteEntity +import com.mogo.module.v2x.R +import com.mogo.module.v2x.V2XServiceManager +import com.mogo.module.v2x.scenario.impl.AbsV2XScenario +import com.mogo.module.v2x.utils.V2XUtils +import com.mogo.service.windowview.IMogoTopViewStatusListener + +/** + * created by wujifei on 2020/12/29 17:57 + * describe:基于目的地预判的道路事件提醒、路线推荐 + */ +class V2XRecommendRouteScenario : AbsV2XScenario() { + + init { + v2XWindow = V2XRecommendRouteWindow() + } + + override fun init(v2XMessageEntity: V2XMessageEntity?) { + v2XMessageEntity?.content?.let { + if (v2XMessageEntity!!.isShowState) { + if (!isSameScenario(v2XMessageEntity)) { + // 更新要提醒的数据 + setV2XMessageEntity(v2XMessageEntity) + show() + } else { + // 更新要提醒的数据 + setV2XMessageEntity(v2XMessageEntity) + } + } else { + close() + } + } + } + + + override fun show() { + if (V2XServiceManager.getMoGoStatusManager().isMainPageOnResume) { + showWindow() + } + } + + override fun showWindow() { + v2XWindow?.let { + val layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + V2XUtils.getApp().resources.getDimension(R.dimen.module_v2x_fatigue_driving_window_height_ground).toInt()) + V2XServiceManager.getMogoTopViewManager().addView(it.view, layoutParams) + it.show(v2XMessageEntity.content) + + } + } + + override fun closeWindow() { + v2XWindow?.let { + it.close() + } + } + + override fun showButton() { + TODO("Not yet implemented") + } + + override fun closeButton() { + TODO("Not yet implemented") + } + + override fun drawPOI() { + TODO("Not yet implemented") + } + + override fun clearPOI() { + TODO("Not yet implemented") + } + + val mogoTopViewStatusListener: IMogoTopViewStatusListener = object : IMogoTopViewStatusListener { + override fun onViewAdded(view: View?) { + TODO("Not yet implemented") + } + + override fun onViewRemoved(view: View?) { + TODO("Not yet implemented") + } + + override fun beforeViewAddAnim(view: View?) { + TODO("Not yet implemented") + } + + override fun beforeViewRemoveAnim(view: View?) { + TODO("Not yet implemented") + } + } + + +} \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteWindow.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteWindow.kt new file mode 100644 index 0000000000..a921a2c168 --- /dev/null +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteWindow.kt @@ -0,0 +1,87 @@ +package com.mogo.module.v2x.scenario.scene.destination + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.PagerSnapHelper +import androidx.recyclerview.widget.RecyclerView +import com.mogo.module.common.entity.V2XEventShowEntity +import com.mogo.module.common.entity.V2XMessageEntity +import com.mogo.module.common.entity.V2XRecommendRouteEntity +import com.mogo.module.v2x.R +import com.mogo.module.v2x.V2XServiceManager +import com.mogo.module.v2x.adapter.V2XRoadEventAdapter +import com.mogo.module.v2x.listener.V2XWindowStatusListener +import com.mogo.module.v2x.scenario.scene.V2XBasWindow +import com.mogo.module.v2x.scenario.view.IV2XWindow + +/** + * created by wujifei on 2020/12/25 11:45 + * describe:基于目的地预判的道路事件场景弹窗 + */ +class V2XRecommendRouteWindow @JvmOverloads constructor( + context: Context = V2XServiceManager.getContext(), + attrs: AttributeSet? = null, + defStyleAttr: Int = 0) : V2XBasWindow(context, attrs, defStyleAttr), IV2XWindow { + + private var rvRoadEventList: RecyclerView? = null + private var mV2XRoadEventAdapter: V2XRoadEventAdapter? = null + + // 列表展示 + private val mItemList = mutableListOf() + + init { + initView(context) + } + + private fun initView(context: Context) { + // 填充布局 + LayoutInflater.from(context).inflate(R.layout.window_fault_help, this) + rvRoadEventList = findViewById(R.id.rvRoadEventList); + mV2XRoadEventAdapter = V2XRoadEventAdapter(mItemList, this) + rvRoadEventList?.setAdapter(mV2XRoadEventAdapter) + // 设置切换样式 + PagerSnapHelper().attachToRecyclerView(rvRoadEventList) + // 配置列表朝向 + val layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + rvRoadEventList?.setLayoutManager(layoutManager) + rvRoadEventList?.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + if (recyclerView.childCount > 0) { + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + // 用户处于交互的时候延后隐藏时间 + // countDownV2XEvent() + } + } + } + }) + } + + + override fun close() { + //移除窗体 + V2XServiceManager.getMogoTopViewManager().removeView(this) + } + + override fun getView(): View { + return this + } + + override fun setWindowStatusListener(listener: V2XWindowStatusListener) {} + + override fun show(entity: V2XRecommendRouteEntity?) { + entity.let { + // 清空数据 + mItemList.clear() + val v2XEventShowEntity = V2XEventShowEntity() + v2XEventShowEntity.v2XRecommendRouteEntity = entity + v2XEventShowEntity.viewType = V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_ROUTE + mItemList.add(v2XEventShowEntity) + // 刷新列表 + mV2XRoadEventAdapter?.notifyDataSetChanged() + } + } +} \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/test/V2XTestConsoleWindow.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/test/V2XTestConsoleWindow.java index 0c3d3b3cc8..f474f567a5 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/test/V2XTestConsoleWindow.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/test/V2XTestConsoleWindow.java @@ -280,7 +280,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout { mBtnTriggerTrafficSearch.setOnClickListener(v -> V2XServiceManager.getIMogoTrafficUploadProvider().verifyCurrentTrafficStatus()); mBtnTriggerPrejectedRoadEvent.setOnClickListener(view -> { - V2XServiceManager.getV2XRefreshModel().queryRoadData("XTCAA83540301871"); + V2XServiceManager.getV2XRefreshModel().queryRoadData("ZD802C1938L10797"); }); /* diff --git a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_recommend_route.xml b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_recommend_route.xml new file mode 100644 index 0000000000..e6ffe54e9d --- /dev/null +++ b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_recommend_route.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + From 437e99827c741000c8627b7a07210f55b2259b28 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 10:35:17 +0800 Subject: [PATCH 11/51] =?UTF-8?q?vr=E5=88=87=E6=8D=A2=E5=88=B02d=E6=97=B6?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=9C=B0=E5=9B=BE=E7=9A=84=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/map/impl/custom/AMapViewWrapper.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index 09633693d8..07b4e7b29c 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -85,6 +85,7 @@ public class AMapViewWrapper implements IMogoMapView, private Location mLastDriveLocationShadow = null; private EnumMapUI mCurrentUI; + private boolean mIsLightStyle = false; public AMapViewWrapper( MapAutoView mMapView ) { startTime = System.currentTimeMillis(); @@ -327,10 +328,12 @@ public class AMapViewWrapper implements IMogoMapView, case Type_Light: mMapView.getMapAutoViewHelper().setAutoSwitchStyle( false ); mMapView.getMapAutoViewHelper().setMapStyle( MapAutoApi.MAP_STYLE_DAY ); + mIsLightStyle = true; break; case Type_Night: mMapView.getMapAutoViewHelper().setAutoSwitchStyle( false ); mMapView.getMapAutoViewHelper().setMapStyle( MapAutoApi.MAP_STYLE_NIGHT ); + mIsLightStyle = false; break; case Type_AUTO_LIGHT_Night: mMapView.getMapAutoViewHelper().setAutoSwitchStyle( true ); @@ -776,6 +779,9 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void onChangeMapStyle( int i ) { + + EnumMapUI last = mCurrentUI; + if ( i == MapAutoApi.MAP_STYLE_DAY || i == MapAutoApi.MAP_STYLE_DAY_NAV ) { mCurrentUI = EnumMapUI.Type_Light; @@ -789,6 +795,14 @@ public class AMapViewWrapper implements IMogoMapView, } else if ( i == MapAutoApi.MAP_PERSPECTIVE_3D ) { mCurrentUI = EnumMapUI.CarUp_3D; } + + // vr 模式切换到普通模式下,保持之前的白天模式 wtf. + if ( last == EnumMapUI.Type_VR && mCurrentUI != last ) { + if ( mIsLightStyle ) { + changeMapMode( EnumMapUI.Type_Light ); + return; + } + } if ( mCurrentUI != null ) { UiThreadHandler.post( () -> { try { @@ -817,7 +831,11 @@ public class AMapViewWrapper implements IMogoMapView, } else { if ( mCurrentUI == EnumMapUI.Type_VR ) { changeZoom( 16 ); - changeMapMode( EnumMapUI.Type_Night ); + if ( mIsLightStyle ) { + changeMapMode( EnumMapUI.Type_Light ); + } else { + changeMapMode( EnumMapUI.Type_Night ); + } Logger.d( TAG, "自动切换为2D模式" ); } } From fb91d546218d590bd8c23f7a8a3f85088f9251ae Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 10:35:17 +0800 Subject: [PATCH 12/51] =?UTF-8?q?vr=E5=88=87=E6=8D=A2=E5=88=B02d=E6=97=B6?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=9C=B0=E5=9B=BE=E7=9A=84=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/map/impl/custom/AMapViewWrapper.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index aec9e0f31a..8798ede32d 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -85,6 +85,7 @@ public class AMapViewWrapper implements IMogoMapView, private Location mLastDriveLocationShadow = null; private EnumMapUI mCurrentUI; + private boolean mIsLightStyle = false; public AMapViewWrapper( MapAutoView mMapView ) { startTime = System.currentTimeMillis(); @@ -326,10 +327,12 @@ public class AMapViewWrapper implements IMogoMapView, case Type_Light: mMapView.getMapAutoViewHelper().setAutoSwitchStyle( false ); mMapView.getMapAutoViewHelper().setMapStyle( MapAutoApi.MAP_STYLE_DAY ); + mIsLightStyle = true; break; case Type_Night: mMapView.getMapAutoViewHelper().setAutoSwitchStyle( false ); mMapView.getMapAutoViewHelper().setMapStyle( MapAutoApi.MAP_STYLE_NIGHT ); + mIsLightStyle = false; break; case Type_AUTO_LIGHT_Night: mMapView.getMapAutoViewHelper().setAutoSwitchStyle( true ); @@ -775,6 +778,9 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void onChangeMapStyle( int i ) { + + EnumMapUI last = mCurrentUI; + if ( i == MapAutoApi.MAP_STYLE_DAY || i == MapAutoApi.MAP_STYLE_DAY_NAV ) { mCurrentUI = EnumMapUI.Type_Light; @@ -788,6 +794,14 @@ public class AMapViewWrapper implements IMogoMapView, } else if ( i == MapAutoApi.MAP_PERSPECTIVE_3D ) { mCurrentUI = EnumMapUI.CarUp_3D; } + + // vr 模式切换到普通模式下,保持之前的白天模式 wtf. + if ( last == EnumMapUI.Type_VR && mCurrentUI != last ) { + if ( mIsLightStyle ) { + changeMapMode( EnumMapUI.Type_Light ); + return; + } + } if ( mCurrentUI != null ) { UiThreadHandler.post( () -> { try { @@ -816,7 +830,11 @@ public class AMapViewWrapper implements IMogoMapView, } else { if ( mCurrentUI == EnumMapUI.Type_VR ) { changeZoom( 16 ); - changeMapMode( EnumMapUI.Type_Night ); + if ( mIsLightStyle ) { + changeMapMode( EnumMapUI.Type_Light ); + } else { + changeMapMode( EnumMapUI.Type_Night ); + } Logger.d( TAG, "自动切换为2D模式" ); } } From 6ac489f56162e6621a4210b7734c7d23723511bb Mon Sep 17 00:00:00 2001 From: liujing Date: Wed, 30 Dec 2020 13:06:55 +0800 Subject: [PATCH 13/51] [fix] UI --- .../src/main/res/layout/item_v2x_event_detail_vr.xml | 2 +- .../src/main/res/layout/item_v2x_fault_help_vr.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_event_detail_vr.xml b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_event_detail_vr.xml index c4f2fd14aa..d0d64e7d06 100644 --- a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_event_detail_vr.xml +++ b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_event_detail_vr.xml @@ -36,7 +36,7 @@ Date: Wed, 30 Dec 2020 14:12:28 +0800 Subject: [PATCH 14/51] bugfix --- libraries/map-custom/build.gradle | 2 +- .../drawer/marker/MapMarkerAdapter.java | 10 +- .../drawer/marker/MapMarkerInfoView.java | 154 +++++++++--------- .../common/drawer/marker/MapMarkerView.java | 57 ++++--- .../module_services_marker_vr_bkg_checked.png | Bin 0 -> 4561 bytes .../com/mogo/module/service/MogoServices.java | 14 +- 6 files changed, 123 insertions(+), 114 deletions(-) create mode 100644 modules/mogo-module-common/src/main/res/drawable-xhdpi/module_services_marker_vr_bkg_checked.png diff --git a/libraries/map-custom/build.gradle b/libraries/map-custom/build.gradle index f355e8380f..e6d6a83127 100644 --- a/libraries/map-custom/build.gradle +++ b/libraries/map-custom/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation project(':foudations:mogo-commons') } - implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.5.4' + implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.5.5' // implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.4.5-log-1' } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerAdapter.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerAdapter.java index 8a130a1f59..7ec3052510 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerAdapter.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerAdapter.java @@ -50,10 +50,10 @@ public class MapMarkerAdapter { * @return MarkerView */ public static IMarkerView getMarkerInfoWindowView( Context context, MarkerShowEntity markerShowEntity, MogoMarkerOptions options ) { - if ( markerShowEntity.isChecked() ) { - return new MapMarkerInfoView( context, markerShowEntity, options ); - } else { - return new MapMarkerView( context, markerShowEntity, options ); - } +// if ( markerShowEntity.isChecked() ) { +// return new MapMarkerInfoView( context, markerShowEntity, options ); +// } else { +// } + return new MapMarkerView( context, markerShowEntity, options ); } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerInfoView.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerInfoView.java index 2bacde6a7e..627b15f3a9 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerInfoView.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerInfoView.java @@ -52,7 +52,11 @@ public class MapMarkerInfoView extends MapMarkerBaseView { public MapMarkerInfoView( Context context, MarkerShowEntity markerShowEntity, MogoMarkerOptions options ) { super( context ); mOptions = options; - updateView( markerShowEntity ); + try { + updateView( markerShowEntity ); + } catch ( Exception e ) { + e.printStackTrace(); + } } @Override @@ -60,7 +64,7 @@ public class MapMarkerInfoView extends MapMarkerBaseView { LayoutInflater.from( context ).inflate( R.layout.modudle_services_marker_layout_info, this ); ivUserHead = findViewById( R.id.ivUserHead ); // ivIcon = findViewById( R.id.ivIcon ); - ivIcon = findViewById(R.id.ivIcon); + ivIcon = findViewById( R.id.ivIcon ); clMarkerContent = findViewById( R.id.clMarkerContent ); ivReverseTriangle = findViewById( R.id.ivReverseTriangle ); ivCar = findViewById( R.id.ivCar ); @@ -69,84 +73,80 @@ public class MapMarkerInfoView extends MapMarkerBaseView { @Override public void updateView( MarkerShowEntity markerShowEntity ) { - try { - Object bindObj = markerShowEntity.getBindObj(); + Object bindObj = markerShowEntity.getBindObj(); - if ( MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { - ivCar.setImageResource( R.drawable.icon_map_marker_location_yellow_vr ); - } else { - ivCar.setImageResource( R.drawable.icon_map_marker_location_yellow ); - } - clMarkerContent.setBackgroundResource( R.drawable.bg_map_marker_yellow_info ); - ivReverseTriangle.setImageResource( R.drawable.bg_shape_reverse_yellow ); - switch ( markerShowEntity.getMarkerType() ) { - case ModuleNames.CARD_TYPE_CARS_CHATTING: - case ModuleNames.CARD_TYPE_USER_DATA: - ivUserHead.setVisibility( View.VISIBLE ); - ivIcon.setVisibility( View.INVISIBLE ); - loadImageWithMarker( markerShowEntity ); - ivCar.setImageResource( R.drawable.icon_map_marker_car_gray ); - //ivCar.setRotation(new Random().nextInt(360)); - ivCar.setRotation( ( float ) markerShowEntity.getMarkerLocation().getAngle() ); - break; - case ModuleNames.CARD_TYPE_ROAD_CONDITION: - case ModuleNames.CARD_TYPE_NOVELTY: - ivUserHead.setVisibility( View.INVISIBLE ); - ivIcon.setVisibility( View.VISIBLE ); - - if ( bindObj instanceof MarkerExploreWay && ( ( MarkerExploreWay ) bindObj ).getPoiType() != null ) { - // 根据poiType获取对应的图片 - String poiType = ((MarkerExploreWay) bindObj).getPoiType(); - PoiWrapper poiWrapper = - CloudPoiManager.getInstance().getWrapperByPoiType(poiType); - if (poiWrapper != null) { - // 加载图片 - loadPoiTypeIcon(poiWrapper.getIconInfoUrl(),poiWrapper.getIconInfoRes()); - }else{ - Logger.e(TAG, "未能根据poiType获取对应poi信息,无法渲染info marker====" + poiType); - } - } - break; - case ModuleNames.CARD_TYPE_SHARE_MUSIC: - ivUserHead.setVisibility( View.INVISIBLE ); - ivIcon.setVisibility( View.VISIBLE ); - - if ( bindObj instanceof MarkerShareMusic ) { - // 2 为书籍听书,3 为新闻,1 为qq音乐,int - switch ( ( ( MarkerShareMusic ) bindObj ).getShareType() ) { - case 1: - ivIcon.setImageResource( R.drawable.icon_map_marker_misic ); - break; - case 2: - ivIcon.setImageResource( R.drawable.icon_map_marker_book ); - break; - case 3: - ivIcon.setImageResource( R.drawable.icon_map_marker_news ); - break; - default: - ivIcon.setImageResource( R.drawable.icon_map_marker_misic ); - break; - } - } - - break; - default: - break; - } - if ( !TextUtils.isEmpty( markerShowEntity.getTextContent() ) ) { - String content; - if ( markerShowEntity.getTextContent().length() > 8 ) { - content = markerShowEntity.getTextContent().substring( 0, 7 ) + "..."; - } else { - content = markerShowEntity.getTextContent(); - } - tvMarkerContent.setText( content ); - } - - } catch ( Exception e ) { - e.printStackTrace(); + if ( MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { + ivCar.setImageResource( R.drawable.icon_map_marker_location_yellow_vr ); + } else { + ivCar.setImageResource( R.drawable.icon_map_marker_location_yellow ); } + clMarkerContent.setBackgroundResource( R.drawable.bg_map_marker_yellow_info ); + ivReverseTriangle.setImageResource( R.drawable.bg_shape_reverse_yellow ); + switch ( markerShowEntity.getMarkerType() ) { + case ModuleNames.CARD_TYPE_CARS_CHATTING: + case ModuleNames.CARD_TYPE_USER_DATA: + ivUserHead.setVisibility( View.VISIBLE ); + ivIcon.setVisibility( View.INVISIBLE ); + loadImageWithMarker( markerShowEntity ); + ivCar.setImageResource( R.drawable.icon_map_marker_car_gray ); + //ivCar.setRotation(new Random().nextInt(360)); + ivCar.setRotation( ( float ) markerShowEntity.getMarkerLocation().getAngle() ); + break; + case ModuleNames.CARD_TYPE_ROAD_CONDITION: + case ModuleNames.CARD_TYPE_NOVELTY: + ivUserHead.setVisibility( View.INVISIBLE ); + ivIcon.setVisibility( View.VISIBLE ); + + if ( bindObj instanceof MarkerExploreWay && ( ( MarkerExploreWay ) bindObj ).getPoiType() != null ) { + // 根据poiType获取对应的图片 + String poiType = ( ( MarkerExploreWay ) bindObj ).getPoiType(); + PoiWrapper poiWrapper = + CloudPoiManager.getInstance().getWrapperByPoiType( poiType ); + if ( poiWrapper != null ) { + // 加载图片 + loadPoiTypeIcon( poiWrapper.getIconInfoUrl(), poiWrapper.getIconInfoRes() ); + } else { + Logger.e( TAG, "未能根据poiType获取对应poi信息,无法渲染info marker====" + poiType ); + } + } + break; + case ModuleNames.CARD_TYPE_SHARE_MUSIC: + ivUserHead.setVisibility( View.INVISIBLE ); + ivIcon.setVisibility( View.VISIBLE ); + + if ( bindObj instanceof MarkerShareMusic ) { + // 2 为书籍听书,3 为新闻,1 为qq音乐,int + switch ( ( ( MarkerShareMusic ) bindObj ).getShareType() ) { + case 1: + ivIcon.setImageResource( R.drawable.icon_map_marker_misic ); + break; + case 2: + ivIcon.setImageResource( R.drawable.icon_map_marker_book ); + break; + case 3: + ivIcon.setImageResource( R.drawable.icon_map_marker_news ); + break; + default: + ivIcon.setImageResource( R.drawable.icon_map_marker_misic ); + break; + } + } + + break; + default: + break; + } + if ( !TextUtils.isEmpty( markerShowEntity.getTextContent() ) ) { + String content; + if ( markerShowEntity.getTextContent().length() > 8 ) { + content = markerShowEntity.getTextContent().substring( 0, 7 ) + "..."; + } else { + content = markerShowEntity.getTextContent(); + } + tvMarkerContent.setText( content ); + } + } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerView.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerView.java index 694414bf7b..9201252762 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerView.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapMarkerView.java @@ -24,11 +24,11 @@ import com.mogo.utils.logger.Logger; * desc : 地图Marker图标 * version: 1.0 */ -public class -MapMarkerView extends MapMarkerBaseView { +public class MapMarkerView extends MapMarkerBaseView { private String TAG = "MapMarkerView"; private FrameLayout clMarkerTopView; + private MarkerShowEntity mMarkerShowEntity; public MapMarkerView( Context context ) { super( context ); @@ -45,7 +45,12 @@ MapMarkerView extends MapMarkerBaseView { public MapMarkerView( Context context, MarkerShowEntity markerShowEntity, MogoMarkerOptions options ) { super( context ); mOptions = options; - updateView( markerShowEntity ); + mMarkerShowEntity = markerShowEntity; + try { + updateView( markerShowEntity ); + } catch ( Exception e ) { + e.printStackTrace(); + } } @Override @@ -55,37 +60,35 @@ MapMarkerView extends MapMarkerBaseView { } else { LayoutInflater.from( context ).inflate( R.layout.modudle_services_marker_layout, this ); } - ivIcon = findViewById( R.id.ivIcon ); clMarkerTopView = findViewById( R.id.clMarkerTopView ); + ivIcon = findViewById( R.id.ivIcon ); ivCar = findViewById( R.id.ivCar ); } @Override public void updateView( MarkerShowEntity markerShowEntity ) { - try { - Object bindObj = markerShowEntity.getBindObj(); - switch ( markerShowEntity.getMarkerType() ) { - case ModuleNames.CARD_TYPE_ROAD_CONDITION: - case ModuleNames.CARD_TYPE_NOVELTY: - if ( bindObj instanceof MarkerExploreWay && ( ( MarkerExploreWay ) bindObj ).getPoiType() != null ) { - // 根据poiType获取对应的图片 - String poiType = ( ( MarkerExploreWay ) bindObj ).getPoiType(); - PoiWrapper poiWrapper = - CloudPoiManager.getInstance().getWrapperByPoiType( poiType ); - if ( poiWrapper != null ) { - // 加载图片 - loadPoiTypeIcon( poiWrapper.getIconUrl(), poiWrapper.getIconRes() ); - } else { - Logger.e( TAG, "未能根据poiType获取对应poi信息,无法渲染marker====" + poiType ); - } + Object bindObj = markerShowEntity.getBindObj(); + switch ( markerShowEntity.getMarkerType() ) { + case ModuleNames.CARD_TYPE_ROAD_CONDITION: + case ModuleNames.CARD_TYPE_NOVELTY: + if ( mMarkerShowEntity != null && mMarkerShowEntity.isChecked() ) { + clMarkerTopView.setBackgroundResource( R.drawable.module_services_marker_vr_bkg_checked ); + } + if ( bindObj instanceof MarkerExploreWay && ( ( MarkerExploreWay ) bindObj ).getPoiType() != null ) { + // 根据poiType获取对应的图片 + String poiType = ( ( MarkerExploreWay ) bindObj ).getPoiType(); + PoiWrapper poiWrapper = + CloudPoiManager.getInstance().getWrapperByPoiType( poiType ); + if ( poiWrapper != null ) { + // 加载图片 + loadPoiTypeIcon( poiWrapper.getIconUrl(), poiWrapper.getIconRes() ); + } else { + Logger.e( TAG, "未能根据poiType获取对应poi信息,无法渲染marker====" + poiType ); } - break; - default: - break; - } - - } catch ( Exception e ) { - e.printStackTrace(); + } + break; + default: + break; } } diff --git a/modules/mogo-module-common/src/main/res/drawable-xhdpi/module_services_marker_vr_bkg_checked.png b/modules/mogo-module-common/src/main/res/drawable-xhdpi/module_services_marker_vr_bkg_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..b82a2b5226459271ed843ca6a2c4b19685f22bdf GIT binary patch literal 4561 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 literal 0 HcmV?d00001 diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index 59406a8a9a..fb0db8e17d 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -927,6 +927,8 @@ public class MogoServices implements IMogoMapListener, return mLastCarLocation; } + private boolean mLastStatusIsVr = false; + @Override public void onMapModeChanged( EnumMapUI ui ) { if ( ui == EnumMapUI.Type_VR ) { @@ -934,11 +936,15 @@ public class MogoServices implements IMogoMapListener, MapCenterPointStrategy.resetByChangeMode(); MapMarkerManager.getInstance().redrawMarkerByStyleChanged(); AIAssist.getInstance( mContext ).speakTTSVoice( "你已进入鹰眼模式" ); + mLastStatusIsVr = true; } else { - MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode( TAG, false ); - MapCenterPointStrategy.resetByChangeMode(); - MapMarkerManager.getInstance().redrawMarkerByStyleChanged(); - AIAssist.getInstance( mContext ).speakTTSVoice( "你已离开鹰眼模式" ); + if ( mLastStatusIsVr ) { + mLastStatusIsVr = false; + MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode( TAG, false ); + MapCenterPointStrategy.resetByChangeMode(); + MapMarkerManager.getInstance().redrawMarkerByStyleChanged(); + AIAssist.getInstance( mContext ).speakTTSVoice( "你已离开鹰眼模式" ); + } } } } From 9b898e9497cb1fa9411e48e721d50e1692ef075d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Wed, 30 Dec 2020 14:21:33 +0800 Subject: [PATCH 15/51] opt --- .idea/gradle.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index cfc605c98e..b892d6479b 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -84,7 +84,6 @@ From eff01b24fb4d3b2da3e1b3f1deb85ffd2fbf9254 Mon Sep 17 00:00:00 2001 From: liujing Date: Wed, 30 Dec 2020 11:24:46 +0800 Subject: [PATCH 16/51] =?UTF-8?q?[add]=20=E8=B4=9D=E5=A1=9E=E5=B0=94?= =?UTF-8?q?=E6=9B=B2=E7=BA=BF=E5=8A=A8=E7=94=BBwindow=E5=B1=82=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/animation/BezierAnimationView.java | 18 +++++- .../layout/module_common_bezier_layout.xml | 13 +++++ .../v2x/adapter/holder/V2XRoadEventVH.java | 55 ++++++++++++++++++- .../src/main/res/values-xhdpi/dimens.xml | 3 + 4 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 modules/mogo-module-common/src/main/res/layout/module_common_bezier_layout.xml diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/animation/BezierAnimationView.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/animation/BezierAnimationView.java index 2bed0dae80..2e3b93492d 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/animation/BezierAnimationView.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/animation/BezierAnimationView.java @@ -73,11 +73,27 @@ public class BezierAnimationView extends RelativeLayout implements View.OnClickL runnable.run(); } + public void bezierAnimationStart(){ + runnable = new Runnable() { + @Override + public void run() { + try { + Log.d("点赞--", ""); + bezierAnimation(resource); + handler.postDelayed(this, 500); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + runnable.run(); + } + private void bezierAnimation(int resource) { final ImageView imageView = new ImageView(context); imageView.setBackgroundResource(animation_drawable[resource]); RelativeLayout.LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - params.addRule(ALIGN_BOTTOM); +// params.addRule(ALIGN_BOTTOM); params.addRule(CENTER_HORIZONTAL); imageView.setLayoutParams(params); addView(imageView); diff --git a/modules/mogo-module-common/src/main/res/layout/module_common_bezier_layout.xml b/modules/mogo-module-common/src/main/res/layout/module_common_bezier_layout.xml new file mode 100644 index 0000000000..f5838417a5 --- /dev/null +++ b/modules/mogo-module-common/src/main/res/layout/module_common_bezier_layout.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRoadEventVH.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRoadEventVH.java index f269856f7b..d94f0c7d15 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRoadEventVH.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRoadEventVH.java @@ -3,6 +3,7 @@ package com.mogo.module.v2x.adapter.holder; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; +import android.os.Handler; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; @@ -10,11 +11,13 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; +import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.debug.DebugConfig; import com.mogo.module.common.animation.BezierAnimationView; import com.mogo.module.common.entity.MarkerExploreWay; @@ -23,6 +26,7 @@ import com.mogo.module.common.entity.V2XEventShowEntity; import com.mogo.module.common.entity.V2XLiveCarInfoEntity; import com.mogo.module.common.entity.V2XMessageEntity; import com.mogo.module.common.entity.V2XRoadEventEntity; +import com.mogo.module.common.wm.WindowManagerView; import com.mogo.module.v2x.R; import com.mogo.module.v2x.V2XServiceManager; import com.mogo.module.v2x.entity.net.V2XUserInfoRes; @@ -81,7 +85,7 @@ public class V2XRoadEventVH extends V2XBaseViewHolder { private HeartLikeView ivEventZan; private ViewGroup mViewGroup; - + private WindowManagerView mWindowManagerView; // 上传事件的用户信息 private MarkerUserInfo mUserInfo; @@ -312,7 +316,7 @@ public class V2XRoadEventVH extends V2XBaseViewHolder { e.printStackTrace(); } } - + /* * 展示事件的图片/视频资源 * */ @@ -364,6 +368,53 @@ public class V2XRoadEventVH extends V2XBaseViewHolder { } } + private void bezierAnimation(int[] loc) { + if (mWindowManagerView == null) { + Log.d(TAG, "bezierAnimation:null"); + mWindowManagerView = new WindowManagerView.Builder(mContext.getApplicationContext()) + .contentView(R.layout.module_common_bezier_layout) + .size(WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT) + .position(loc[0], loc[1]) + .gravity(Gravity.TOP | Gravity.LEFT) + .showInWindowManager(); + } + try { + if (mWindowManagerView.isShowing()) { + return; + } + mWindowManagerView.show(); + } catch (Exception e) { + e.printStackTrace(); + } + BezierAnimationView bezierAnimationView = mWindowManagerView.findViewById(R.id.bezier_view); + bezierAnimationView.bezierAnimationStart(); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { +// mWindowManagerView.dismiss(); + } + }, 2000); + + } + + public int[] getLocation(View v) { + int[] loc = new int[4]; + int[] location = new int[2]; + v.getLocationOnScreen(location); + loc[0] = location[0]; + loc[1] = location[1]; + int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + v.measure(w, h); + + loc[2] = v.getMeasuredWidth(); + loc[3] = v.getMeasuredHeight(); + + //base = computeWH(); + return loc; + } + /** * 为了给车聊聊更多的信息需要重新查询一次 * diff --git a/modules/mogo-module-v2x/src/main/res/values-xhdpi/dimens.xml b/modules/mogo-module-v2x/src/main/res/values-xhdpi/dimens.xml index 4fb423afdc..5e05de0f6b 100644 --- a/modules/mogo-module-v2x/src/main/res/values-xhdpi/dimens.xml +++ b/modules/mogo-module-v2x/src/main/res/values-xhdpi/dimens.xml @@ -120,5 +120,8 @@ 46px 26px + + 1281px + From f5941daf94b0bc7c24e8fdae84ec81e4019962a4 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 14:37:14 +0800 Subject: [PATCH 17/51] bugfix --- .../main/java/com/mogo/map/impl/custom/AMapViewWrapper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index 8798ede32d..4d02492947 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -575,6 +575,9 @@ public class AMapViewWrapper implements IMogoMapView, if ( !checkAMapView() ) { return; } + if ( mCurrentUI == EnumMapUI.Type_VR ) { + return; + } Logger.i( TAG, "showBounds:%s -%s-%s- %b ", tag, carPosition.toString(), bound.toShortString(), lockCarPosition ); try { if ( DebugConfig.isDebug() ) { From b5e2ee25a4fd449156a7db75b383ac52fde32a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Wed, 30 Dec 2020 14:43:23 +0800 Subject: [PATCH 18/51] opt --- .../mogo/module/small/map/SmallVisionProvider.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java index 258bce4688..42503d9055 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java @@ -66,14 +66,10 @@ public class SmallVisionProvider implements IMogoSmallMapProvider, IMogoStatusCh mContext = context; try { - try { - // 替换高德地图的方法,解决因为加入换肤框架导致地图初始化失败 - Method srcMethod = lg.class.getDeclaredMethod("a", Context.class, int.class, ViewGroup.class); - Method destMethod = lg2.class.getDeclaredMethod("a", Context.class, int.class, ViewGroup.class); - HookManager.get().hookMethod(srcMethod, destMethod); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } + // 替换高德地图的方法,解决因为加入换肤框架导致地图初始化失败 + Method srcMethod = lg.class.getDeclaredMethod("a", Context.class, int.class, ViewGroup.class); + Method destMethod = lg2.class.getDeclaredMethod("a", Context.class, int.class, ViewGroup.class); + HookManager.get().hookMethod(srcMethod, destMethod); } catch (Exception e) { e.printStackTrace(); } From a329707c089f7620c5060e53f106c8ac4f7366d0 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 14:51:08 +0800 Subject: [PATCH 19/51] =?UTF-8?q?vr=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E6=9F=90=E4=BA=9B=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mogo/map/impl/custom/AMapViewWrapper.java | 1 + .../com/mogo/module/common/map/MapCenterPointStrategy.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index 4d02492947..13f8f5a4d5 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -576,6 +576,7 @@ public class AMapViewWrapper implements IMogoMapView, return; } if ( mCurrentUI == EnumMapUI.Type_VR ) { + Logger.w( TAG, "vr 模式下忽略该设置" ); return; } Logger.i( TAG, "showBounds:%s -%s-%s- %b ", tag, carPosition.toString(), bound.toShortString(), lockCarPosition ); diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MapCenterPointStrategy.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MapCenterPointStrategy.java index 7e8a557f30..4e86f84941 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MapCenterPointStrategy.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MapCenterPointStrategy.java @@ -270,6 +270,10 @@ public class MapCenterPointStrategy { if ( controller == null ) { return; } + if ( MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { + Logger.w( TAG, "vr 模式下忽略该设置" ); + return; + } Logger.e( TAG, "scene"+scene ); Map< Integer, Map< String, MapCenterPoint > > strategies = sCommonStrategies; if ( MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { From 52684abcb91ae4909b0faaffd71a6ed88cd089e4 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 15:25:32 +0800 Subject: [PATCH 20/51] =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=AE=8C=E6=88=90=E5=90=8E=E5=9C=A8=E5=B0=9D=E8=AF=95?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=9B=BE=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mogo/map/impl/custom/AMapViewWrapper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index 96ca584dc5..6923ae83ac 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -698,7 +698,9 @@ public class AMapViewWrapper implements IMogoMapView, } NaviClient.getInstance( getContext() ).syncCarLocation( sysLocation ); - MapStyleController.getInstance().onLocationChanged( location, this ); + if ( checkAMapView() ) { + MapStyleController.getInstance().onLocationChanged( location, this ); + } } @Override From d159c8c27619911ef864cde589c8f1b7bbb57537 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 15:25:32 +0800 Subject: [PATCH 21/51] =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=AE=8C=E6=88=90=E5=90=8E=E5=9C=A8=E5=B0=9D=E8=AF=95?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=9B=BE=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mogo/map/impl/custom/AMapViewWrapper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index 13f8f5a4d5..61a8b483b0 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -697,7 +697,9 @@ public class AMapViewWrapper implements IMogoMapView, } NaviClient.getInstance( getContext() ).syncCarLocation( sysLocation ); - MapStyleController.getInstance().onLocationChanged( location, this ); + if ( checkAMapView() ) { + MapStyleController.getInstance().onLocationChanged( location, this ); + } } @Override From 5ed38ad254ac8660fb0688e3fec3e7ec6b228ddc Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 16:08:33 +0800 Subject: [PATCH 22/51] opt --- app/functions/httpdns.gradle | 16 ++++++++-------- .../map/impl/custom/CustomMapApiBuilder.java | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/functions/httpdns.gradle b/app/functions/httpdns.gradle index 176938bc92..0da084c406 100644 --- a/app/functions/httpdns.gradle +++ b/app/functions/httpdns.gradle @@ -8,10 +8,10 @@ project.dependencies { d8xxImplementation rootProject.ext.dependencies.httpdnsnoop d80xImplementation rootProject.ext.dependencies.httpdnsnoop em4Implementation rootProject.ext.dependencies.httpdnsnoop - e8xxImplementation rootProject.ext.dependencies.httpdnstencent - f8xxImplementation rootProject.ext.dependencies.httpdnstencent - f80xImplementation rootProject.ext.dependencies.httpdnstencent - f8AmapImplementation rootProject.ext.dependencies.httpdnstencent + e8xxImplementation rootProject.ext.dependencies.httpdnsnoop + f8xxImplementation rootProject.ext.dependencies.httpdnsnoop + f80xImplementation rootProject.ext.dependencies.httpdnsnoop + f8AmapImplementation rootProject.ext.dependencies.httpdnsnoop em3Implementation rootProject.ext.dependencies.httpdnsnoop } else { bydautoImplementation project(':foudations:httpdns-noop') @@ -20,10 +20,10 @@ project.dependencies { d8xxImplementation project(':foudations:httpdns-noop') d80xImplementation project(':foudations:httpdns-noop') em4Implementation project(':foudations:httpdns-noop') - e8xxImplementation project(':foudations:httpdns-tencent') - f8xxImplementation project(':foudations:httpdns-tencent') - f80xImplementation project(':foudations:httpdns-tencent') - f8AmapImplementation project(':foudations:httpdns-tencent') + e8xxImplementation project(':foudations:httpdns-noop') + f8xxImplementation project(':foudations:httpdns-noop') + f80xImplementation project(':foudations:httpdns-noop') + f8AmapImplementation project(':foudations:httpdns-noop') em3Implementation project(':foudations:httpdns-noop') } } \ No newline at end of file diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java index 2dd9320480..4656d28323 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java @@ -3,6 +3,7 @@ package com.mogo.map.impl.custom; import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.commons.debug.DebugConfig; import com.mogo.map.CoordinatesTransformer; import com.mogo.map.IMogoMapApiBuilder; import com.mogo.map.IMogoMapView; @@ -92,7 +93,7 @@ class CustomMapApiBuilder implements IMogoMapApiBuilder { @Override public IMogoMapView getMapView( Context context ) { NavAutoApi.INSTANCE.init( context, MapParams.Companion.init() - .setDebugMode( true ) + .setDebugMode( DebugConfig.isDebug() ) .setCoordinateType( MapParams.COORDINATETYPE_GCJ02 ) .setPerspectiveMode( MapParams.MAP_PERSPECTIVE_2D ) .setZoom( 16 ) From 3ae09925b9955336e6ffda8dcb8d99efde5b2043 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 16:08:33 +0800 Subject: [PATCH 23/51] opt --- app/functions/httpdns.gradle | 16 ++++++++-------- .../map/impl/custom/CustomMapApiBuilder.java | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/functions/httpdns.gradle b/app/functions/httpdns.gradle index 176938bc92..0da084c406 100644 --- a/app/functions/httpdns.gradle +++ b/app/functions/httpdns.gradle @@ -8,10 +8,10 @@ project.dependencies { d8xxImplementation rootProject.ext.dependencies.httpdnsnoop d80xImplementation rootProject.ext.dependencies.httpdnsnoop em4Implementation rootProject.ext.dependencies.httpdnsnoop - e8xxImplementation rootProject.ext.dependencies.httpdnstencent - f8xxImplementation rootProject.ext.dependencies.httpdnstencent - f80xImplementation rootProject.ext.dependencies.httpdnstencent - f8AmapImplementation rootProject.ext.dependencies.httpdnstencent + e8xxImplementation rootProject.ext.dependencies.httpdnsnoop + f8xxImplementation rootProject.ext.dependencies.httpdnsnoop + f80xImplementation rootProject.ext.dependencies.httpdnsnoop + f8AmapImplementation rootProject.ext.dependencies.httpdnsnoop em3Implementation rootProject.ext.dependencies.httpdnsnoop } else { bydautoImplementation project(':foudations:httpdns-noop') @@ -20,10 +20,10 @@ project.dependencies { d8xxImplementation project(':foudations:httpdns-noop') d80xImplementation project(':foudations:httpdns-noop') em4Implementation project(':foudations:httpdns-noop') - e8xxImplementation project(':foudations:httpdns-tencent') - f8xxImplementation project(':foudations:httpdns-tencent') - f80xImplementation project(':foudations:httpdns-tencent') - f8AmapImplementation project(':foudations:httpdns-tencent') + e8xxImplementation project(':foudations:httpdns-noop') + f8xxImplementation project(':foudations:httpdns-noop') + f80xImplementation project(':foudations:httpdns-noop') + f8AmapImplementation project(':foudations:httpdns-noop') em3Implementation project(':foudations:httpdns-noop') } } \ No newline at end of file diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java index 2dd9320480..4656d28323 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java @@ -3,6 +3,7 @@ package com.mogo.map.impl.custom; import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.commons.debug.DebugConfig; import com.mogo.map.CoordinatesTransformer; import com.mogo.map.IMogoMapApiBuilder; import com.mogo.map.IMogoMapView; @@ -92,7 +93,7 @@ class CustomMapApiBuilder implements IMogoMapApiBuilder { @Override public IMogoMapView getMapView( Context context ) { NavAutoApi.INSTANCE.init( context, MapParams.Companion.init() - .setDebugMode( true ) + .setDebugMode( DebugConfig.isDebug() ) .setCoordinateType( MapParams.COORDINATETYPE_GCJ02 ) .setPerspectiveMode( MapParams.MAP_PERSPECTIVE_2D ) .setZoom( 16 ) From 61bc8475967634f2655420ceb8c3c406bb1b6185 Mon Sep 17 00:00:00 2001 From: liujing Date: Wed, 30 Dec 2020 16:21:05 +0800 Subject: [PATCH 24/51] =?UTF-8?q?vr=E6=A8=A1=E5=BC=8F=E9=9A=90=E8=97=8Fugc?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/module/v2x/scenario/impl/V2XScenarioManager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java index 41e131b359..666cbca23a 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java @@ -1,6 +1,7 @@ package com.mogo.module.v2x.scenario.impl; import android.content.Intent; +import android.util.Log; import androidx.localbroadcastmanager.content.LocalBroadcastManager; @@ -91,7 +92,11 @@ public class V2XScenarioManager implements IV2XScenarioManager { mV2XScenario = new V2XIllegalParkScenario(); break; case V2XMessageEntity.V2XTypeEnum.ALERT_EVENT_UGC_WARNING: - mV2XScenario = new V2XEventUgcScenario(); + if (V2XServiceManager.getMoGoStatusManager().isVrMode() == false) { + mV2XScenario = new V2XEventUgcScenario(); + } else { + mV2XScenario = null; + } break; case V2XMessageEntity.V2XTypeEnum.ALERT_VOICE_CALL_FOR_LIVECAR_SHOW: mV2XScenario = new V2XVoiceCallLiveScenario(); From e5c88cce3f12fc4134e28972c60cd644e13a79dc Mon Sep 17 00:00:00 2001 From: liujing Date: Wed, 30 Dec 2020 16:23:46 +0800 Subject: [PATCH 25/51] no message --- .../mogo/module/v2x/scenario/impl/V2XScenarioManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java index 666cbca23a..05ace32d78 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java @@ -92,10 +92,10 @@ public class V2XScenarioManager implements IV2XScenarioManager { mV2XScenario = new V2XIllegalParkScenario(); break; case V2XMessageEntity.V2XTypeEnum.ALERT_EVENT_UGC_WARNING: - if (V2XServiceManager.getMoGoStatusManager().isVrMode() == false) { - mV2XScenario = new V2XEventUgcScenario(); - } else { + if (V2XServiceManager.getMoGoStatusManager().isVrMode()) { mV2XScenario = null; + } else { + mV2XScenario = new V2XEventUgcScenario(); } break; case V2XMessageEntity.V2XTypeEnum.ALERT_VOICE_CALL_FOR_LIVECAR_SHOW: From e721fe426e5fefa24dc44aa5d8129619ea2e7c13 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Wed, 30 Dec 2020 16:25:26 +0800 Subject: [PATCH 26/51] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E6=9C=BA=E5=9E=8B=E4=B8=8A=E5=9B=A0vr=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=95=8C=E9=9D=A2=E5=BC=82=E5=B8=B8=202.=20?= =?UTF-8?q?=E5=B0=86http=20dns=E6=9B=BF=E6=8D=A2=E6=88=90noop=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 1 + app/build.gradle | 4 +++- .../java/com/mogo/base/websocket/WebSocketConstant.java | 8 ++++---- .../mogo/module/main/launcher/MainLauncherActivity.java | 2 +- .../src/main/res/values-ldpi/dimens.xml | 5 +++++ .../src/main/res/values-mdpi/dimens.xml | 5 +++++ .../src/main/res/values-xhdpi/dimens.xml | 5 +++++ 7 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 main-extensions/mogo-module-main-launcher/src/main/res/values-ldpi/dimens.xml create mode 100644 main-extensions/mogo-module-main-launcher/src/main/res/values-mdpi/dimens.xml create mode 100644 main-extensions/mogo-module-main-launcher/src/main/res/values-xhdpi/dimens.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 5974cf305a..9d8d20d50d 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -84,6 +84,7 @@ diff --git a/app/build.gradle b/app/build.gradle index 3309333674..9579c302f8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -484,6 +484,7 @@ dependencies { implementation rootProject.ext.dependencies.moduleextensions implementation rootProject.ext.dependencies.modulemap implementation rootProject.ext.dependencies.moduleSmallMap + implementation rootProject.ext.dependencies.httpdnsnoop } else { implementation project(':foudations:mogo-commons') implementation project(':foudations:mogo-base-websocket-sdk') @@ -501,6 +502,7 @@ dependencies { implementation project(':modules:mogo-module-extensions') implementation project(':modules:mogo-module-map') implementation project(':modules:mogo-module-smp') + implementation project(':foudations:httpdns-noop') } apply from: "./functions/basedmap.gradle" @@ -513,7 +515,7 @@ dependencies { apply from: "./functions/crashreport.gradle" apply from: "./functions/widgets.gradle" apply from: "./functions/tts.gradle" - apply from: "./functions/httpdns.gradle" +// apply from: "./functions/httpdns.gradle" apply from: "./functions/backwidget.gradle" apply from: "./functions/mediaui.gradle" apply from: "./functions/bizguide.gradle" diff --git a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java index f0e5ec13b7..df1706b0c5 100644 --- a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java +++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java @@ -8,11 +8,11 @@ import com.mogo.commons.debug.DebugConfig; @Keep public class WebSocketConstant { - private static final String HOST_DEV = "ws://62.234.196.121"; - private static final String HOST_QA = "ws://62.234.196.121"; - private static final String HOST_DEMO = "ws://62.234.196.121"; + private static final String HOST_DEV = "ws://119.45.249.167"; + private static final String HOST_QA = "ws://119.45.249.167"; + private static final String HOST_DEMO = "ws://119.45.249.167"; @Keep - private static final String HOST_RELEASE = "ws://62.234.196.121"; + private static final String HOST_RELEASE = "ws://119.45.249.167"; // private static final String PORT = ":14001/ws"; @Keep public static final String PATH = "/ws"; diff --git a/main-extensions/mogo-module-main-launcher/src/main/java/com/zhidao/mogo/module/main/launcher/MainLauncherActivity.java b/main-extensions/mogo-module-main-launcher/src/main/java/com/zhidao/mogo/module/main/launcher/MainLauncherActivity.java index 5582493834..1c73531d6c 100644 --- a/main-extensions/mogo-module-main-launcher/src/main/java/com/zhidao/mogo/module/main/launcher/MainLauncherActivity.java +++ b/main-extensions/mogo-module-main-launcher/src/main/java/com/zhidao/mogo/module/main/launcher/MainLauncherActivity.java @@ -131,7 +131,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis mLeftShadowFrame.setVisibility(View.GONE); mApps.setVisibility(View.GONE); }else{ - entranceParams.leftMargin = getResources().getDimensionPixelSize( R.dimen.module_main_entrance_fragment_container_marginLeft_out_vr_mode ); + entranceParams.leftMargin = getResources().getDimensionPixelSize( R.dimen.module_main_id_entrance_fragment_container_marginLeft ); mLeftShadowFrame.setVisibility(View.VISIBLE); mApps.setVisibility(View.VISIBLE); } diff --git a/main-extensions/mogo-module-main-launcher/src/main/res/values-ldpi/dimens.xml b/main-extensions/mogo-module-main-launcher/src/main/res/values-ldpi/dimens.xml new file mode 100644 index 0000000000..4b84e40d04 --- /dev/null +++ b/main-extensions/mogo-module-main-launcher/src/main/res/values-ldpi/dimens.xml @@ -0,0 +1,5 @@ + + + 0px + 444px + \ No newline at end of file diff --git a/main-extensions/mogo-module-main-launcher/src/main/res/values-mdpi/dimens.xml b/main-extensions/mogo-module-main-launcher/src/main/res/values-mdpi/dimens.xml new file mode 100644 index 0000000000..4b84e40d04 --- /dev/null +++ b/main-extensions/mogo-module-main-launcher/src/main/res/values-mdpi/dimens.xml @@ -0,0 +1,5 @@ + + + 0px + 444px + \ No newline at end of file diff --git a/main-extensions/mogo-module-main-launcher/src/main/res/values-xhdpi/dimens.xml b/main-extensions/mogo-module-main-launcher/src/main/res/values-xhdpi/dimens.xml new file mode 100644 index 0000000000..25247f638b --- /dev/null +++ b/main-extensions/mogo-module-main-launcher/src/main/res/values-xhdpi/dimens.xml @@ -0,0 +1,5 @@ + + + 0px + 800px + \ No newline at end of file From c34291d4cf5ebd955d8d53e2e33668d9c5c094f1 Mon Sep 17 00:00:00 2001 From: liujing Date: Wed, 30 Dec 2020 16:30:26 +0800 Subject: [PATCH 27/51] =?UTF-8?q?vr=E6=A8=A1=E5=BC=8F=E9=9A=90=E8=97=8Fugc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/module/v2x/scenario/impl/V2XScenarioManager.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java index 05ace32d78..154e90da24 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java @@ -92,11 +92,7 @@ public class V2XScenarioManager implements IV2XScenarioManager { mV2XScenario = new V2XIllegalParkScenario(); break; case V2XMessageEntity.V2XTypeEnum.ALERT_EVENT_UGC_WARNING: - if (V2XServiceManager.getMoGoStatusManager().isVrMode()) { - mV2XScenario = null; - } else { - mV2XScenario = new V2XEventUgcScenario(); - } + mV2XScenario = V2XServiceManager.getMoGoStatusManager().isVrMode() ? null : new V2XEventUgcScenario(); break; case V2XMessageEntity.V2XTypeEnum.ALERT_VOICE_CALL_FOR_LIVECAR_SHOW: mV2XScenario = new V2XVoiceCallLiveScenario(); From be237dd3237ded70fad66f8dcaecb718eed683d6 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Wed, 30 Dec 2020 16:35:39 +0800 Subject: [PATCH 28/51] =?UTF-8?q?=E5=B0=86http=20dns=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=88=90noop=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +++- .../java/com/mogo/base/websocket/WebSocketConstant.java | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 87bfe5dff1..35ae13fe20 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -484,6 +484,7 @@ dependencies { implementation rootProject.ext.dependencies.moduleextensions implementation rootProject.ext.dependencies.modulemap implementation rootProject.ext.dependencies.moduleSmallMap + implementation rootProject.ext.dependencies.httpdnsnoop } else { implementation project(':foudations:mogo-commons') implementation project(':foudations:mogo-base-websocket-sdk') @@ -501,6 +502,7 @@ dependencies { implementation project(':modules:mogo-module-extensions') implementation project(':modules:mogo-module-map') implementation project(':modules:mogo-module-smp') + implementation project(':foudations:httpdns-noop') } apply from: "./functions/basedmap.gradle" @@ -513,7 +515,7 @@ dependencies { apply from: "./functions/crashreport.gradle" apply from: "./functions/widgets.gradle" apply from: "./functions/tts.gradle" - apply from: "./functions/httpdns.gradle" +// apply from: "./functions/httpdns.gradle" apply from: "./functions/backwidget.gradle" apply from: "./functions/mediaui.gradle" apply from: "./functions/bizguide.gradle" diff --git a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java index f0e5ec13b7..df1706b0c5 100644 --- a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java +++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java @@ -8,11 +8,11 @@ import com.mogo.commons.debug.DebugConfig; @Keep public class WebSocketConstant { - private static final String HOST_DEV = "ws://62.234.196.121"; - private static final String HOST_QA = "ws://62.234.196.121"; - private static final String HOST_DEMO = "ws://62.234.196.121"; + private static final String HOST_DEV = "ws://119.45.249.167"; + private static final String HOST_QA = "ws://119.45.249.167"; + private static final String HOST_DEMO = "ws://119.45.249.167"; @Keep - private static final String HOST_RELEASE = "ws://62.234.196.121"; + private static final String HOST_RELEASE = "ws://119.45.249.167"; // private static final String PORT = ":14001/ws"; @Keep public static final String PATH = "/ws"; From 386b90337850d047f1b392a1eb758721d5e52598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Wed, 30 Dec 2020 16:38:37 +0800 Subject: [PATCH 29/51] =?UTF-8?q?=E5=87=86=E5=A4=87=E5=BC=80=E5=A7=8B?= =?UTF-8?q?=E7=BC=96=E5=86=99=20=E5=9F=BA=E4=BA=8E=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E8=BF=9D=E7=AB=A0=E9=AB=98=E5=8F=91=E6=83=85=E5=86=B5?= =?UTF-8?q?=E7=9A=84=E5=81=9C=E8=BD=A6=E6=8E=A8=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/module/v2x/alarm/V2XAlarmServer.java | 2 +- .../java/com/mogo/module/v2x/network/V2XRefreshModel.java | 2 +- .../scene/destination/V2XRecommendParkingLotScenario.java | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendParkingLotScenario.java diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/alarm/V2XAlarmServer.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/alarm/V2XAlarmServer.java index d42c409a80..10b0be5657 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/alarm/V2XAlarmServer.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/alarm/V2XAlarmServer.java @@ -249,7 +249,7 @@ public class V2XAlarmServer { LocationUtils.geoCodeSearch(location, new IMogoGeoSearchListener() { @Override public void onRegeocodeSearched(MogoRegeocodeResult regeocodeResult) { - //Logger.i(MODULE_NAME, "根据经纬度查询结果为:" + regeocodeResult.getRegeocodeAddress().getFormatAddress()); + Logger.i(MODULE_NAME, "根据经纬度查询结果为:" + regeocodeResult.getRegeocodeAddress().getFormatAddress()); String keyword = "停车场"; boolean isHighWay = false; if (regeocodeResult == null || regeocodeResult.getRegeocodeAddress() == null || diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java index e1ea631bc9..80ae877241 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java @@ -701,7 +701,7 @@ public class V2XRefreshModel { @Override public void onError(Throwable e) { super.onError(e); - Logger.d("queryRoadData:onError", e.toString()); + Logger.d("queryRoadDataOfVehiclesRecommend:onError", e.toString()); } }); } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendParkingLotScenario.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendParkingLotScenario.java new file mode 100644 index 0000000000..b3b5cd8daa --- /dev/null +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendParkingLotScenario.java @@ -0,0 +1,8 @@ +package com.mogo.module.v2x.scenario.scene.destination; + +/** + * 基于目的地违章高发情况的停车推荐 + * http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48958095 + */ +public class V2XRecommendParkingLotScenario { +} From 63002f1bd668cad2676bfa34532816c08570bd2b Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 16:08:33 +0800 Subject: [PATCH 30/51] bugfix --- .../java/com/mogo/module/service/MogoServices.java | 12 +++++++----- .../mogo/service/impl/adas/MogoADASController.java | 4 ++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index fb0db8e17d..dcb08560b4 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -932,11 +932,13 @@ public class MogoServices implements IMogoMapListener, @Override public void onMapModeChanged( EnumMapUI ui ) { if ( ui == EnumMapUI.Type_VR ) { - MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode( TAG, true ); - MapCenterPointStrategy.resetByChangeMode(); - MapMarkerManager.getInstance().redrawMarkerByStyleChanged(); - AIAssist.getInstance( mContext ).speakTTSVoice( "你已进入鹰眼模式" ); - mLastStatusIsVr = true; + if ( !mLastStatusIsVr ) { + MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode( TAG, true ); + MapCenterPointStrategy.resetByChangeMode(); + MapMarkerManager.getInstance().redrawMarkerByStyleChanged(); + AIAssist.getInstance( mContext ).speakTTSVoice( "你已进入鹰眼模式" ); + mLastStatusIsVr = true; + } } else { if ( mLastStatusIsVr ) { mLastStatusIsVr = false; diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java index f82bf29011..f828ef9ab8 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java @@ -323,6 +323,10 @@ public class MogoADASController implements IMogoADASController { return; } + if ( MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { + return; + } + try { AutopilotServiceManage.getInstance().showAdas(); } catch ( Exception e ) { From 80ecc411fb04b0a9d4c979fcfe5676aeaabba3f2 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Wed, 30 Dec 2020 17:10:09 +0800 Subject: [PATCH 31/51] =?UTF-8?q?http=20dns=20noop=20=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E4=BC=A0=E5=85=A5=E7=9A=84host?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 1 + .../src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 426ff6b360..8efbfa420e 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -85,6 +85,7 @@ diff --git a/foudations/httpdns-noop/src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java b/foudations/httpdns-noop/src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java index fdf50007aa..5cd0e7df49 100644 --- a/foudations/httpdns-noop/src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java +++ b/foudations/httpdns-noop/src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java @@ -26,13 +26,13 @@ class HttpDnsNoop implements IMogoHttpDns { @Override public String getCachedHttpDnsIps( String host,int type ) { - return null; + return host; } @Override public void getHttpDnsIp( String host,int type, boolean useCache, IHttpDnsCallback callback ) { if ( callback != null ) { - callback.onParsed( null ); + callback.onParsed( host ); } } From 11fb2d54e50188b78aca51882f1f661ed40bf380 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Wed, 30 Dec 2020 17:10:09 +0800 Subject: [PATCH 32/51] =?UTF-8?q?http=20dns=20noop=20=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E4=BC=A0=E5=85=A5=E7=9A=84host?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/foudations/httpdns-noop/src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java b/foudations/httpdns-noop/src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java index fdf50007aa..5cd0e7df49 100644 --- a/foudations/httpdns-noop/src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java +++ b/foudations/httpdns-noop/src/main/java/com/mogo/httpdns/noop/HttpDnsNoop.java @@ -26,13 +26,13 @@ class HttpDnsNoop implements IMogoHttpDns { @Override public String getCachedHttpDnsIps( String host,int type ) { - return null; + return host; } @Override public void getHttpDnsIp( String host,int type, boolean useCache, IHttpDnsCallback callback ) { if ( callback != null ) { - callback.onParsed( null ); + callback.onParsed( host ); } } From 2e8a0ec17fe13caf13851dd42d61b677a07842a0 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 30 Dec 2020 17:20:50 +0800 Subject: [PATCH 33/51] opt --- .../src/main/java/com/mogo/module/v2x/V2XConst.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XConst.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XConst.java index 621795f269..32f5a48e60 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XConst.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XConst.java @@ -133,4 +133,11 @@ public class V2XConst { * 绿波车速marker */ public static final String V2X_OPTIMAL_SPEED_MARKER = "V2X_OPTIMAL_SPEED_MARKER"; + + //免唤醒词 + public static final String[] UNWAKE_NAVI_CONFIRM = {"开始导航", "开启导航", "好的", "开始", "导航", "确定", "确认", "好"}; + public static final String[] UNWAKE_NAVI_CANCLE = {"取消", "关闭", "不要", "不导航"}; + public static final String V2X_CONFIRM_ACTION = "V2X_CONFIRM_ACTION"; + public static final String V2X_CANCLE_ACTION = "V2X_CANCLE_ACTION"; + } From 3d223d1fd896f3d8143a0c3d0cec3781b92f57d2 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 30 Dec 2020 17:40:02 +0800 Subject: [PATCH 34/51] add voice control --- .../java/com/mogo/module/v2x/V2XConst.java | 6 --- .../adapter/holder/V2XRecommendRouteVH.java | 46 ++++++++++++++++++- .../module/v2x/voice/V2XVoiceConstants.java | 10 ++++ 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XConst.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XConst.java index 32f5a48e60..216a7b9b08 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XConst.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XConst.java @@ -134,10 +134,4 @@ public class V2XConst { */ public static final String V2X_OPTIMAL_SPEED_MARKER = "V2X_OPTIMAL_SPEED_MARKER"; - //免唤醒词 - public static final String[] UNWAKE_NAVI_CONFIRM = {"开始导航", "开启导航", "好的", "开始", "导航", "确定", "确认", "好"}; - public static final String[] UNWAKE_NAVI_CANCLE = {"取消", "关闭", "不要", "不导航"}; - public static final String V2X_CONFIRM_ACTION = "V2X_CONFIRM_ACTION"; - public static final String V2X_CANCLE_ACTION = "V2X_CANCLE_ACTION"; - } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java index a9150a6c42..e5699c96fa 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java @@ -1,5 +1,6 @@ package com.mogo.module.v2x.adapter.holder; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -8,10 +9,14 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import com.mogo.module.common.entity.MarkerExploreWay; import com.mogo.module.common.entity.V2XEventShowEntity; import com.mogo.module.common.entity.V2XRecommendRouteEntity; import com.mogo.module.v2x.R; import com.mogo.module.v2x.scenario.view.IV2XWindow; +import com.mogo.module.v2x.voice.V2XVoiceCallbackListener; +import com.mogo.module.v2x.voice.V2XVoiceConstants; +import com.mogo.module.v2x.voice.V2XVoiceManager; /** * created by wujifei on 2020/12/29 20:39 @@ -31,6 +36,45 @@ public class V2XRecommendRouteVH extends V2XBaseViewHolder { + try { + //开启导航 TODO + MarkerExploreWay exploreWay = new MarkerExploreWay(); + triggerStartNavi(exploreWay); + Log.d("V2XRecommendRouteVH", "mStartNavi ------"); + } catch (Exception e) { + e.printStackTrace(); + } + }; + + private V2XVoiceCallbackListener mCancleNavi = (command, intent) -> { + try { + //取消导航 + unRegisterUnwakeNavi(); + Log.d("V2XRecommendRouteVH", "cancleNavi ------"); + } catch (Exception e) { + e.printStackTrace(); + } + }; + + private void registerUnwakeNavi() { + V2XVoiceManager.INSTANCE + .registerWakeCmd(V2XVoiceConstants.V2X_CONFIRM_ACTION, + mStartNavi) + .registerWakeCmd(V2XVoiceConstants.V2X_CANCLE_ACTION, + mCancleNavi); + } + + private void unRegisterUnwakeNavi() { + V2XVoiceManager.INSTANCE + .unRegisterWakeCmd(V2XVoiceConstants.V2X_CONFIRM_ACTION) + .unRegisterWakeCmd(V2XVoiceConstants.V2X_CANCLE_ACTION); + } + + + + } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/voice/V2XVoiceConstants.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/voice/V2XVoiceConstants.java index 6f22e219a8..42e1448fd5 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/voice/V2XVoiceConstants.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/voice/V2XVoiceConstants.java @@ -283,6 +283,13 @@ public class V2XVoiceConstants { public static final String COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP = "COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP"; public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP_WORDS = {"没注意", "没看到", "没有施工","无施工", "很正常", "取消", "关闭"}; + //免唤醒词 + public static final String V2X_CONFIRM_ACTION = "V2X_CONFIRM_ACTION"; + public static final String[] UNWAKE_NAVI_CONFIRM = {"开始导航", "开启导航", "好的", "开始", "导航", "确定", "确认", "好"}; + + public static final String V2X_CANCLE_ACTION = "V2X_CANCLE_ACTION"; + public static final String[] UNWAKE_NAVI_CANCLE = {"取消", "关闭", "不要", "不导航"}; + static { // 免唤醒 默认 @@ -321,6 +328,9 @@ public class V2XVoiceConstants { sVoiceCmds.put(COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_YES_UN_WAKEUP, COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_YES_UN_WAKEUP_WORDS); sVoiceCmds.put(COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP, COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP_WORDS); + sVoiceCmds.put(V2X_CONFIRM_ACTION, UNWAKE_NAVI_CONFIRM); + sVoiceCmds.put(V2X_CANCLE_ACTION, UNWAKE_NAVI_CANCLE); + //2020-6-24 顺义演示需求添加,现合并至launcher 更新时间:2020-08-25 sVoiceCmds.put(COMMAND_ZHIDAO_V2X_CALL_FRONT_CAR_DEMO_UN_WAKEUP, COMMAND_ZHIDAO_V2X_CALL_FRONT_CAR_DEMO_UN_WAKEUP_WORDS); From f80af8c3cf26985d3f97f8150eafcdeb4023a5f5 Mon Sep 17 00:00:00 2001 From: wujifei Date: Wed, 30 Dec 2020 17:47:33 +0800 Subject: [PATCH 35/51] =?UTF-8?q?new#=E5=9F=BA=E4=BA=8E=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E9=A2=84=E5=88=A4=E7=9A=84=E9=81=93=E8=B7=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E9=86=92=E3=80=81=E8=B7=AF=E7=BA=BF=E6=8E=A8?= =?UTF-8?q?=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/V2XRecommendRouteEntity.java | 10 ++++ modules/mogo-module-v2x/build.gradle | 3 ++ .../v2x/adapter/V2XRoadEventAdapter.java | 3 ++ .../adapter/holder/V2XRecommendRouteVH.java | 46 ++++++++++++++++-- .../module/v2x/network/V2XRefreshModel.java | 10 +--- .../destination/V2XRecommendRouteScenario.kt | 18 +++++-- .../main/res/drawable-ldpi/v2x_icon_route.png | Bin 0 -> 18544 bytes .../res/drawable-ldpi/v2x_to_nav_nomal.png | Bin 0 -> 11698 bytes .../res/drawable-ldpi/v2x_to_nav_pressed.png | Bin 0 -> 11025 bytes .../v2x_icon_route.png | Bin 0 -> 18544 bytes .../v2x_to_nav_nomal.png | Bin 0 -> 11698 bytes .../v2x_to_nav_pressed.png | Bin 0 -> 11025 bytes .../res/drawable-xhdpi/v2x_icon_route.png | Bin 0 -> 18544 bytes .../res/drawable-xhdpi/v2x_to_nav_nomal.png | Bin 0 -> 11698 bytes .../res/drawable-xhdpi/v2x_to_nav_pressed.png | Bin 0 -> 11025 bytes .../src/main/res/drawable/v2x_to_nav.xml | 6 +++ .../res/layout/item_v2x_fatigue_driving.xml | 2 +- .../res/layout/item_v2x_recommend_route.xml | 35 ++++--------- .../main/res/layout/window_test_console.xml | 2 +- .../src/main/res/values/strings.xml | 3 +- 20 files changed, 92 insertions(+), 46 deletions(-) create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-ldpi/v2x_icon_route.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-ldpi/v2x_to_nav_nomal.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-ldpi/v2x_to_nav_pressed.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi-1920x1000/v2x_icon_route.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi-1920x1000/v2x_to_nav_nomal.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi-1920x1000/v2x_to_nav_pressed.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi/v2x_icon_route.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi/v2x_to_nav_nomal.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi/v2x_to_nav_pressed.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable/v2x_to_nav.xml diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java index d95387b5f2..9523dbfd4f 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java @@ -1,9 +1,19 @@ package com.mogo.module.common.entity; +import java.util.List; + /** * created by wujifei on 2020/12/24 15:33 * describe:基于目的地预判的道路事件 */ public class V2XRecommendRouteEntity { + private List toPoint; + public List getToPoint() { + return toPoint; + } + + public void setToPoint(List toPoint) { + this.toPoint = toPoint; + } } diff --git a/modules/mogo-module-v2x/build.gradle b/modules/mogo-module-v2x/build.gradle index 47ab18a430..2eaadb3a28 100644 --- a/modules/mogo-module-v2x/build.gradle +++ b/modules/mogo-module-v2x/build.gradle @@ -60,6 +60,9 @@ dependencies { implementation rootProject.ext.dependencies.androidxviewpager2 implementation rootProject.ext.dependencies.localbroadcastmanager + implementation rootProject.ext.dependencies.coroutinescore + implementation rootProject.ext.dependencies.coroutinesandroid + implementation rootProject.ext.dependencies.videoarmv7 implementation rootProject.ext.dependencies.videoarm64 implementation rootProject.ext.dependencies.videojava diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/V2XRoadEventAdapter.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/V2XRoadEventAdapter.java index b4a68452b2..26c35201d5 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/V2XRoadEventAdapter.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/V2XRoadEventAdapter.java @@ -102,6 +102,9 @@ public class V2XRoadEventAdapter extends RecyclerView.Adapter { - private TextView mTvAddress, mTvAddressDistance; +public class V2XRecommendRouteVH extends V2XBaseViewHolder { + private TextView mTvAddress; private ImageView mIvToNav, mIvClose; + private MarkerExploreWay mNoveltyInfo; public V2XRecommendRouteVH(ViewGroup viewGroup, IV2XWindow v2XWindow) { - super(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_v2x_fatigue_driving, viewGroup, false), v2XWindow); + super(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_v2x_recommend_route, viewGroup, false), v2XWindow); mTvAddress = itemView.findViewById(R.id.tvAddress); - mTvAddressDistance = itemView.findViewById(R.id.tvAddressDistance); mIvToNav = itemView.findViewById(R.id.ivToNav); mIvClose = itemView.findViewById(R.id.ivClose); + mIvToNav.setOnClickListener(v -> triggerStartNavi(mNoveltyInfo)); + mIvClose.setOnClickListener(v -> delayedCloseWindow()); } @Override - public void initView(V2XRecommendRouteEntity viewData) { + public void initView(V2XEventShowEntity v2XEventShowEntity) { + MarkerLocation markerLocation = new MarkerLocation(); + markerLocation.setLon(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(0)); + markerLocation.setLat(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(1)); + mNoveltyInfo = new MarkerExploreWay(); + mNoveltyInfo.setLocation(markerLocation); + MogoLocation mogoLocation = new MogoLocation(); + mogoLocation.setLongitude(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(0)); + mogoLocation.setLatitude(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(1)); + getLocationInfo(mogoLocation); } + + /** + * 获取定位相关信息 + */ + private void getLocationInfo(MogoLocation location) { + // 定位当前位置是否是高速 + LocationUtils.geoCodeSearch(location, new IMogoGeoSearchListener() { + @Override + public void onRegeocodeSearched(MogoRegeocodeResult regeocodeResult) { + mTvAddress.setText("前往 " + regeocodeResult.getRegeocodeAddress().getFormatAddress()); + } + + @Override + public void onGeocodeSearched(MogoGeocodeResult geocodeResult) { + } + }); + } } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java index e1ea631bc9..575f4aa97a 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java @@ -676,12 +676,12 @@ public class V2XRefreshModel { @Override public void onNext(V2XRoadDataRes v2XRoadDataRes) { super.onNext(v2XRoadDataRes); - Logger.d("queryRoadData:onSuccess", v2XRoadDataRes.toString()); if (v2XRoadDataRes == null || v2XRoadDataRes.getResult() == null) { return; } if (v2XRoadDataRes.getResult().getPoiData() != null && v2XRoadDataRes.getResult().getPoiData().size() > 0) { V2XRecommendRouteEntity v2XRecommendRouteEntity = new V2XRecommendRouteEntity(); + v2XRecommendRouteEntity.setToPoint(v2XRoadDataRes.getResult().getTopPoint()); V2XMessageEntity v2xMessageEntity = new V2XMessageEntity<>(); // 控制类型 v2xMessageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_ROUTE); @@ -694,15 +694,9 @@ public class V2XRefreshModel { intent.putExtra(V2XConst.BROADCAST_SCENE_EXTRA_KEY, v2xMessageEntity); LocalBroadcastManager.getInstance(V2XUtils.getApp()).sendBroadcast(intent); } else if (v2XRoadDataRes.getResult().getIllegalParkingData() != null && v2XRoadDataRes.getResult().getIllegalParkingData().size() > 0) { - + // TODO: 2020/12/30 } } - - @Override - public void onError(Throwable e) { - super.onError(e); - Logger.d("queryRoadData:onError", e.toString()); - } }); } } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt index e14165cb62..23f795f105 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt @@ -9,6 +9,10 @@ import com.mogo.module.v2x.V2XServiceManager import com.mogo.module.v2x.scenario.impl.AbsV2XScenario import com.mogo.module.v2x.utils.V2XUtils import com.mogo.service.windowview.IMogoTopViewStatusListener +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch /** * created by wujifei on 2020/12/29 17:57 @@ -48,7 +52,7 @@ class V2XRecommendRouteScenario : AbsV2XScenario() { v2XWindow?.let { val layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V2XUtils.getApp().resources.getDimension(R.dimen.module_v2x_fatigue_driving_window_height_ground).toInt()) - V2XServiceManager.getMogoTopViewManager().addView(it.view, layoutParams) + V2XServiceManager.getMogoTopViewManager().addView(it.view, layoutParams,mogoTopViewStatusListener) it.show(v2XMessageEntity.content) } @@ -77,20 +81,24 @@ class V2XRecommendRouteScenario : AbsV2XScenario() { } val mogoTopViewStatusListener: IMogoTopViewStatusListener = object : IMogoTopViewStatusListener { + private val mainScope = MainScope() override fun onViewAdded(view: View?) { - TODO("Not yet implemented") + mainScope.launch { + delay(1000 * 20) + closeWindow() + } } override fun onViewRemoved(view: View?) { - TODO("Not yet implemented") + mainScope.cancel() } override fun beforeViewAddAnim(view: View?) { - TODO("Not yet implemented") + } override fun beforeViewRemoveAnim(view: View?) { - TODO("Not yet implemented") + } } diff --git a/modules/mogo-module-v2x/src/main/res/drawable-ldpi/v2x_icon_route.png b/modules/mogo-module-v2x/src/main/res/drawable-ldpi/v2x_icon_route.png new file mode 100644 index 0000000000000000000000000000000000000000..bff6a53df5fe206f616d1b7892518fa79eb736ba GIT binary patch literal 18544 zcmV)*K#9MJP)Pyg07*naRCodHod>uzMUnSq6;wnK1OyR5l490f6a$hB7*N-=rd1@lt^qNCt_cxP z44;ZQt>79lt_y2G#RMpeDC?>SisYyy$q0V`-`x4nTc=OYoSBo}doNSZQ@5(Cs;jH2 zr)PTR%sKZKw^**Q%B&Lm+u#0X->V32Vw_veYB2d_Fb`M^GuB{=dTaIGOL$8mKA^iR zgKI?%e^)ZA$o?kjs#I;zNY&|sGQe>h#Di5-j-QAl*{=o_NVLjz18FYE^MBRx1Jc;x zzUq8ww3PmZYCqLB(mzJBTdQ4+q4u?{22&?z^iy>@Ob%*6wnt0p%pY4Cs@p18j~q;$ zozbh*;i}qEfal|H zVZK5#$T2rKuB0mA`f9H!0p%-#mFzMMM%9vF&c!eVIb1QqEpG8K>F+39OJXQ~8O)i9 z9X%M4ZCY5Cf8^{bVW71n1}_xuA@spuO8+XMijgn}L># zI-|c+>Hb`{8L)uDksBF`;jJ|Yr2&XI!qe4wpzuIBzcMOHp8li8C^A`1gD?l*79K5J zTlg$tgyI~S8H7rlBP@$9WE=(aKd0ipvxs_35~U6p~_M`Dly14)K&`c;sYrBKND zPNjwQN2pzN)&LK$dS{q8kZjkDCU#cIWV}wT3@74aP0QgY_10_o3GBkBhR z!f;@)av)?L=pu{^(tlX|HbR#uN4HWS1D7B7AE0u!p774#fFje7%~yqg5S}S~N5*7G zlxDVmX`$d&Ie*A{LIGtcK+$bbvIH>of$&`oCO*zpJnvyQ6^MiR)HP7rsf^M)=~@9D zXlzQWsi>H)j+*Q>z`&eq>D)NhKyvg^4HVB7T(6!J2bYZxHrD73od#0p56M||t_y=z zGC6%R1Im^yU*TV}>st+^PVZMIoD~k$ad+_pAe;Y`z*+uC{JTp7#uz=292{x~8sJ4` z=UO8B?@CEPTzU=@0;_n^7Ml6LMU-s@DLk&S%A-W-^Up%EVT|U16kRbVO@qj0E8!D` zKymvc`)%c%!MMH^gVAV$VovG|781EDL7iB-=&EPU>!=%^>IB5FRDGqmT_|3U8NSotziR&k~+zUF{sn zh|>6gAlmN_PPk5q)pl3y7YmOQo*?|W zu!AXSZ)bSskd2Ja zvfW7J`@&){*^WGf<3N<7XshGEjh5sS0}&a#;M|@nO$VB)^XRN7m1=(1QmCq}a&|Q6 z`Q=;z&3v_Zoad0hip5An0%_cT)1h3Q%TncH%w-@ZC01SRq^ROoQh&8!CA46gQ~_|U zdY{mzI;fGc&1dxrl;`vVP$q?agdz{wUypF=Nommi^TUBFI;0C*&|NyZi%X2i+T ze!7CbT9m6+vE>(wyaMUjp$`fx?HG&(;?8O)5e>BG814vsGxhsG@JRyr=Q6OnFkXwQ zFZR`;cU&*ipYiSmmKUS5^%vI)Mh@*4Kxde04v}H_hI2@g#hMPEU+E_%JJ61j|x97{G`zLfUP~L51*Q( zcg012$=@n8d?$4(1)qHVO89HxZ-ldXH2QZg=ZywEY6BL2Cu`wI#jjsx_gAUG|q4Q-t$uVYmo;o5K?h&wvw4+n375I%4os z60u2!g`~wF1$rBq{fE$leOG*S1`@xq@Segi2Qv4xNzB9B5`UV|Vmj_wFYWy?A zxF9@bzDu+js&Z7;@p5u)nV75fB-yfX&nWw_2GBLZ;qr52lR-|WanF*xN=W=>soki7 z2khl=4GH2JVkYq6LP&ygKtc)WYc2Z!PS zv`R|Om{A^+7-GNMO86Ne>jq@dYc<%;q6Mh`gT!z$_?_gZFG$<}4armq$&a564LORz z4Ji@G;hlmawU_Ve!{5VYw~5dLvw*SxKiTXd+6gr7S?Yi<`!j!6`73tgbq>=Y2khi{ zol=n6k<3K{#-X8pKULE~(ARt#VC%NVtDTuJbit;PV}Yvct@X20c*D z*#vuonr>KWAE}w}ZGSEn9+hEd7?>S|Ljqe)gDQ!)%8&PnBw}P-^G+~rzfH-Vn8qQW z@vhoxna=1V8b;8d`-p5VtP3^`zN!5@1zSB-2??c>!M9=lnhJ?$BG7>EmxHDNJv-cI z@f?E(FC*<0Y;nsk|JbrrhGLgZ`)}OHK_h4&o=F@eWIzUsYveo)#sig+AU|K15kB1C z1>n)vqj4acTSH5z5|h5&w|d;Oj%olt1>9HYN;`=E(IB;7XQ}gtTt5Fhcf0&=}jP zLEwxDePl`Di-f33XV5?&QYSm*RJuoJCkt=LGCue{`6zY+^8F08zf}4=Q?v-QY(tQ3 zA@umnDto*F5RLBR5(*Evs84q~KoDy7Qpns%r8z#C?QE2rC#gThWrinrfxV z&{h}=pH_^shMrqGB`KVB1_j31s?FHNSx@$>%bo&wyibdNq0lkhD82v$U13vou%k}> z6&Pr~;=hf8E@?8fjVFmGxIKgbyfJMf->TGG z2Q6Tngnpr(IHfPN7L*9z`{BA0ANZfDHi1sw0UT0%V9T=Lz~6PKq=tF zc&PZNDFGHSix+s*0=dN(OBxBg4EB9ogE-smUGgHu+b0g3HsCg&ykCicqKSA7O+BGo zX#lPd1_q;0>spY|wbg!liSezIVzO_GxAv((%;UX6*@jf z{7%9>gDkSU&`>Z(MqwLXW1lTM#$@cFuMnZ=1ajyz6n(uYan8Dc8oBs2!D&s(oGwX* z@p*$~06HZkhij>~1AeY}`a3aZ1VDeZkOf@KglGiM&hMgd6tA(rCL6}We=)9R_}sJ~ z%2p7PiT0e5Hy1iFj%jYfd?p$=zL5i64>gUwgSvf&uEHWI`AFZbkZQr8V4D8OA!nut zu@Kz9&}M_^$`wh`L49v0@?asS-Q$sU0rh7c?k{8v4sqyz$=B|pLl6TSQX&Y+q_%Ez zx5yo4HA^MWuaA67{Mewe&sOJRMoQ{}tyAaJL1p!FNJTga06E*M6!bMHW&1;sI5_s~ zgdc*w3&_`VWY2ae`Wu-HW8{KFUVt2@m5BCSH;TK&VE+^GMIxd_0HJ-9?B8hH9MyQ7 z`PglweeubAM|a8fi?SGClv8oup+leA(Eh8OUoz04Y^WcnYt{{RKIUENaoam-ykC_= zG?Fyf%2L&oL^KK)-dYN{SEzc$>e4rO%@x@i0eb!!a$(zRL%|qL?~=Ez=csb zikGjGWs?S*ww<7pKThL3eU$H zXpC~}qYOLCO|Achn0Kj&xlik{$%0}Vb#tBeNBT*p9;zcF}0w086%x2+k1SsP5Hr)>ajF&DG9zAcc74%A`%CQJ60&c@2w;TF0hi#4HWM_8Z5rR87GH0V$45N z`?W%Llm_SH_7GKm#j7GC4TpNpK%j)*U%HKnIyR`~`z!GCW)Q+eE*1Yb#KCjn666R>LTt&&rT%nkOYvd~n~y z>UaW;3^?yXrJS#V84zYV%}k_(UMc6Bl>;~#nw}Wwn-u8OZZ6BQW=@pbk2Ofl$vl%} ze!H4L&=;WGuY_?y7Nm3ft0Z`RjtO$W#9>6nMRU)UF+qxrFB5Doxm+PsRjx_s_f#y}j5eYwVMe6%B*ritRWkw1q`9cWzMnP&{=8Y$hrF60sr z;Y#_v34se1l{4WLDCcMwCZ&pJwi85B8iOq@M?Uu}ApDPnZGcmB4nCR_TBf`?#c@CP zZ6SH5xzm1{FisrxC?-hq`Aw3>T2Dy8xgh6q4bs@ae+ro#fuU=Xe3K(jPa?R^+(&IHjCC-N{noxLNauw~4i8vgr1iFp3!iLrgrmcL7fyVQTqk+Ypdc6W95B*g&X zXL7Tu;^DW`cS;%(

?R@aIBe2G-CR3*7Ku+oYP`O5i$}x*oO8=CzV|6vFx00TH}| zL_Rf8;odH1`?YY$b?|jUKcr3j5No>Qip7t7Zn&I&O&L0G^q?mvXJ7c8*Cd^((e5lH zKnDW_{iQ*%-9eLb5B1uj?8(u7_Zlxhko+l$&M_c$pcQrfpVkB zx8Q~fA^EDZzisG)k4Fg&8;N?N!##y3GZ(|oLHLEhw_*2} z(J4a4=k&#n>^{Oe;9lipbxO&dhfVOwce-;cl>_lK=~oN==x-l<*V|_Xi3h<(gVGtb z6zG@a+G9eQ5YRFv(!AIK;2wg5eU-By3K;P_`6=< z$7O%3jzMfQ`X36j3*2tPAWpakT*@CS&0wa`aYq{Kiw zZX{>}s|({}{m&QD_J2;5X|*9xVFupjY44`JrSfKH_*7xc(fLplKJM6flt*_MWjB^y zL2~qi={P)r@J`G+A6ag{ST=tWM%Y}9%}N2MolgtdT#N!vHD}pqP7`#t#&a&@1~^A} zK8k2{vu!7Ini^p^J@KDE_4K3kcHL+e-)&6 zUa6N+W1xSG@I}HKgtkwUbn=f16GTmBEBv-!$+nbjta?^6L-k7{aka9iQXniORYd zjSF@-R(}P{U3!F3{-U01Ot!%Cdx)HJALK;cFSb+ukFwuOKC_SeV~|~W#WU(YCl}wu zljAt;-0fCWLDMgtAom^R^BNVhc%RH2>Zr!yu@Co7_^d;^*XbO~>9RRSc#`m<5;{Fu3KYZh=k-qjf_vkzhIEmJMRXBp=`ZKEUkY1BRfyM%jyS+NT zLukJ)7VQ)zs*0KFX3_sd<@R_6odr1HR=&#>v`#Q?(;pjt+VASnZ(>%lyhl#97vkS> zFmdKBH~RGZ&s5^f09g zG)|IM(V7}3u9nE>LeTt-|3kAmhrMj{dv~|1DN@~Jr5`QSbnnGoDp0$Uw2E#kM|G1C z$Ea+yiWbd-&luoR=W8cPiN&Yd)kM@JjQ-Cxx?bE@pszq*fxZHL1^No~73eF_SD>#z zUxAff0o{l4qaLGfZHh2k8LjMumc#f>6QYLzjSr)nZf2K5ZB}XyO%oFWW1%!oQooWy zwWh&#n3y;muN>D-RKJp9sb3Vt>JSOjfBv2k$t0C6{u>-GR$R+FRxuv(raj75z+$;WoekE=gTh1`$M zZ9s9Z+Qv>c#0T&{lm{meeFEIlhVaCZQ97)=dscw$Wc9JHE2Xi=VuaofLbFP%$q8qgEb~caZK2JN(qmfzt<}%PGK_x#l^P>A1ZVVjAcGY(LYsj@l=DK zQscA=VA}+RUj29?QoyJVwwnu8BJb2dw-GunXdM#Mt6c;d^8m&89*uJkVHy|1=T_H~ z72_4^M_zT{d@KE;oFpZ|X@#F1h>5}jE(km_t~FCTt>Lr_C{}iwUlcknQ{1F6quWUs z9}yuN1$@t|_^xpq<5A8g)+_0k%gGi(#{{LrcN`}DbWXM08bDBI$lvbV?q@Fh6b zNL}NjY?RPw3vY10>S(oMu2d7mj^~BK7@UJ97W1d8Anf=S9Vo7!D5$-Jj@2~AO2PTQ z*FL4tHqbiYNksuoMz)z5)g&D%=Ohq=c1))Kr$W4cW;hp5&ewA8m5LuIu>&jSMwQf4HJHaw1EdY|J9mqIf+(8eyhLPASlR+;%+EQo;V@X{ zK9&zqI~fqpx}gaos2zn4k|E8T^80Y?_?8SP-qRH9fkJXHn0H>t`E5VTZD(q`YHljV z7IUI+3*$Jb0jh-gAaA9E4ya>=5!Px7N^yTjdLFdKd|YQ_@Xr%Qh_+E)@a{aMn3X`; za_8+Q3XGoyNSlYMD+Ltan!<+(A17obKP(A^(^?~FqMk20ZjZ8{i@Xd|Adb`G{u zzq{lVmMM>O#h)W|jR*3Sob~}FwNA|nil+^Fn_9e?$2&gk%^fn;3=#o-I}twJXIuZeBD!s{}eIZLddSLr~v}N z6IAepWDb9n&;}ZY4M8qYit{4{cK9qqQ4E{P|2>4B3{ztIgT_BOH@^B+7x6^@L-pA{ zkqtD}72hWcIn_INY#5t186#4^6!Z;{jtWr zXvDZrls@;rEw&rckGz;;CV435vTyo>!$m!!Ujm&MaG`ae4#e$w#lS%svCRZg=(>la zBjeWmP~*3jhU81zdAkn$uB~O5Ue6!HJSWKkMe4u~cR(|yzn6bc5~rV$D`5)p@NXfG z5xUmS*%Wzt<6eDq&iL*KKQqwL# z!Wi5m?Iz6KLeCB3T$JFy?M6bS(w)(5lD&zq+D0LshN#%OrZ+M zP2!)%?B3Mv-cp`bt{UuID4ayqREIzzsA zGQU=dTw6G}V@_&TV7Y0fC>hI5nFCJ4>!*fpuZ)$%*aSF}14I+Fv3z&E&RwZKzZL#b zc$Scf_;(>dtZiVFohKzy{4znv(#;0C0_HhM4CnwCMsHsL+qa=-v@kkfHZKzXsI>hj z(M?JovYwC+0Z*n;1LV>KIepAO)n|8h3^0?UITLvroZCEooLUU>#VTlmBc$X*$E}2( zAnd;=mHSv*qeY^EW1Aok@pmHru#yhAZO=3>8eFudupB6B#}%E+C1`3 zlcdRE_3)AhTUMSP@Ms5re1e*T&q>I(nQKfPIG#&oFz^IgZC0T5&?acIW5Su7bOjZ2 zpj(k&)H$BlBwe5YVggPUx@BE(mTOX072W}q?8(CDi;t$crqlt?>HxO5n-$z(f5(Dq zbD^JHdyL{egR)a4%QHn5gAXpXN1Oh5D@U?$B^knb~QM2ZvXc zgL|!*=eUtj`b-LU4i3`O+&88BKOs9gKEAHLR4jfXP|mx{f#Zj!eAE41G4|Xhsm%0R zQ7+=SV3F~};A|n_WENVJ|GhG}xI+B5gg?>2!^F%I-dsA5XD#Qi;aB;s+H(ir25yki0l_e?<{+LPtGsuV zH}2(}56)xkv>(BrHh`0O!HB!`^hQb@=8qzt%D`9QIrw)r=R z|E-WOY%wuBHu`&!4d4T?z1~&G{mA)3u0Qb_q-Fs}$xqvR8~5o%72i2!2Xd&x^}592 zVsr|m$yhyTCjq=nMtKE*5Z3@IDZsA5%WB zN7xozh_?2PcI5=M^@$xjx!gtp-Cu=J@VQFtJkbg?7N?a*3)z4)!Kvyy(^DLSD;`e2 zw-q|(NHJl8I3sLGqYL0@Dxe_O9^t5NtoN&*PhTX$7bxK~1MPOvsCu4A+Hrg}TCZ@}nTR4_Ynh)W)}MzO24nD{d4P35lXh z@xPSlJ0xEepu9P_yuD9jP1`#u_LIj6+yxn@Z_!7Aa@z3(#lY%(=4?1^@lX>TklI-O zB#rmo1(TKgS8;G%IiZY#I>wmIJIH;hntA;w4B`ok6Hs}PI}I361sCa8^H#lFhLaqzMLUy{uI zow!%L+op8qT6J9XGYej^ake-{c(>BOW5`iVkh7!QmBu81qp?6i^QI2hBEu+O1NwA= z>_mR~7~wlY+t*D{s(-h9e%^kjMHSCx^2IfiGX`UNT=RAGor>oW*-s1}u(Klt@1UFd zX8qSqkR8c4{eCQTe`rKZeL8`UIzEy(L}MI@VjR%;TdLoF!kxMEcM)_HXn#YJ#F8jdQr#Ta>a~fjl{w)alvM|4{e?;n_kSYI2(8b1kkf zY~3F!Wb?9-&^{xTxSEJ4Hy`zzD#yPdm=-WdCs5%iM!Y8)Ut zteXgrk<-%^Ibe#tu}*_j;l55=mk_|__ z$954T#my*vw2wS}V>|LqI_$PrZokH87T|aogZQCxWBK$G4&+eZ7Si+XZSb+kXNxYnKJ1UWcpE6^mZBf}Vc**LBW!nNp@HAZ!Q_-$);Q!@v}x2*1)ox*pBsGoxyN zn=zA}ByAd24K>M5O3=f$u}Ql0&9)WDPLewFf?`wQQyuSd_t00MuRvdcz5;y(`U>#zUx7tjftuGz$BH<8L^_s}zEfX;#aw|l3ue-{ zMEixbn2&%ywoVmjvtXJWPO_NlKJ056uh;bzSg945bipY2x(mqIFZI?rT&acX2k$Eo zD=@*r>3n?asx;OcAe{$_3HE$nfq7M+W-)R6auu2MIF9}KorKPdDLR-}P5N>A3XD|& zEhhhdL)ZRYkMo$`;;`_K%AT zn>PKUFZXdjwm*Lm{#1CZ4!p}Sm^t|e3(j9E3=JhlWo+QcRy3hBaM7&N4suu(~n<>I8Jzs4#eLgm^P?}#E?E1 zh;dFjq9LTj6Y*=g1E2dKcO*;P*=Mlo4g#H;V>YvVm+oN>qTJ*I&ZNP2!_Z2AB zxovyefZJ{QV;`@QX@A;)eV!ry%fjPzV0QkjM*W6Bb!Gf?F%8*`5IDX%GafuNZt+Gr zsB_%QM^vCZTXMB|vXK8|47lD<&dc$wY%DWP zZ7qia=%bBgrcr0!)HYC_7Jftr?tjy01LajIt^cU5aqLmH=($(QUX{8!YBSi)!bTJK zASL>2Ay*;5wM^-PcJLs}*`zYJ)BfpM{!$rS5RgaJAip$tohBapT2LMweB{7m^t%My zP&`i!*AN241A2VRQfiyH^|Xz3P#|Zspjn|KmjjgtPX=p2dEhhtjvTfgr?y{9h5c|< zx<1#(202|XODdqr;(*&rxOu6HXTVrX__SSi8Is%16g&6#BH*dl3BuoKB3Ih~k|+<> zO%w-D8y_jWyAa65zMyHRYw92Ue@zXpRIZE1D5&CNdl$FV1Ns(?7)PCX_T<#2W1YjB zja(D7u9E#%A^#T7;M$oYhmY+jWAbwgFWR$h@FU|h>AVy`_2J-UaXm@Ml^Sqfrm3t> zUUUxq(|)v16uw0Z>KYn`a-py0c810=GwN0%ws%9HD^0_3tI?ODktT*K&x?e&7RFk^ zyKO2_CmH>&6CNY{wkBs;{l68}Ze!*34B>V{P9V8DNnFUSgL1-wMwyybJMw3%@oLqM zw=W9NxNPqxxhj>O3gQ@|jO`usHUK%p0fU=kLzBT3Xdj^;Te}RoJ$+h3x1r|UpEmb1 zpVefXV&QV9swa8xEZj}VJy)zt%DZhU^UB^bQ|o>$=2fccwHk{#YPu@X#}NHk)`niI zu~_gGjO(a!u$&l80{>d=sSW5eq}YK8jXKxS)V8+ahMB!R^kxsL^EN8NtA(7X zsFCaB`dKDb0a4y0`?i#C6S9Md;QmoIE{`wnlLoeT(;Q&jz!pV6O)mf7o;MF%6I0@Y z2fe7QOQ~(4eCF^O75sP_Jq%YsHD?R9yO1qltflKrC*;<-4F#gkHqe8FKM+m=_LuX) zebT^ZN=?Q&2g^>T$z&V%8X-^Q*cL>H^?^^@*rqbBI`37Xc`V&S%L-^7?kiIk0RNgR zttnpG*59_Li+QOq`?wk-K^$j6((W(!NxVx~!MKhp2TPeLuR?r~3b+<2UC<6rWX|SS zGW@6t+%$3a)zg{^XinCb>K($3N)y+bX6_!fG#grIe&BF`41QpvF=>ne7rc9Sb@Y`Q zMBTFGHCbGJ-XOeVNHW#}K5g4Hm2>9%fBgb-d8R`(M|?Q^LE&0L*SyWV*e32SekLEU z6^;UrGs>=CNaY0Wr%L&Z6^rLdh=sI_eS4f7wr+3N0_wMLv078+HD7!#^-dv=wbQv` zG|!KDDB$^p$L1p8KMRK*T}###H0^``c{~Qz)!CA>*QD^Y=()nW;=3NEJ69}|8_wHo-~RI<*XF*y0{5;}T5ppo~33NIvdJ_+)q z?FGWKgl)inhiq@Q3rQ2f=NL?c3r%t2B+v$2yqt~)2?wc&H{1Il)$!J<0q^DUmdAR+ zgN0iQo8W(?e0X~BHFe18H1@`le^R)5(0jfR#X0jrvOH2ALY!RMBku}q?XHTQVh~Zj ztawepPDh0fOn_o9k&=bqYpRmJK0Bc zlzCH%_ih!gZPBq`GNAgfNH!F5bI%9Tz7Hh-QTSfjaFyr+2dI{B?$RM=tGIWQd@rHr zDWx$FT%>wrFA)9#CV=gNXo%%=q-&$JO{ZwTq<9sZ8`a&*pvg7nYu*&I)P@_=*Q;ok zqg)Q4ny@X}LdccI`ML(N9eGmcz)bCUQT2@|JHiK5Q?^$VfpU4M9K0_$aeQ@GBkSn` z&sCD0%AbT?fHxZkw)fF-7e|ZURz<$Of_$4Wo|&9)O35dc@yYeRD%g^LnN+plasLB_ z)FkGa)&^aQ5*4y&%NOr1EOA}Y9}E2rRk5w$zXFN&SrO$Bv^mBCVFRABb+cPrzMd8WMErgY& zT$@npLeEL$98k5m0$~m`4%C~TS2H^}ys-%m8?Td6eujxyv!T!5=loJ(YGJ7;8o zhx?;}2Mu(wqtV@$kcA4%SHB-yhV0^T2Ju-Hm2)?>jQ0L2)>#OaDyRnJ z!2!lW4nGPxX`CiJSGjW{=?oh41a%tq1TXq!PBzwfXGh^UyvBaE`n^WzIVN9&c~j)( zq2NBke^SQ@aOD5s^KzVC}`ysAM zIpoaEYfWEMzF!f3UwF1~tVJY0z&64zi-Ov}jE+-)ugM2*FaU8*J@3#ck34-|$)5zG z4Lpy%hZYfiJV?@iNjLeHCP3n`c$T?1X&X6T&+7FrQ<)r4;l#>djkDd6MWbDy@6-%a>

5n(q6!9{)KyY3b{J(# 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

dP>ulD&gOrHN4T%CV{jITO<|Y@{7r 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 LNkvXXu0mjfi**?n literal 0 HcmV?d00001 diff --git a/modules/mogo-module-v2x/src/main/res/drawable-xhdpi-1920x1000/v2x_icon_route.png b/modules/mogo-module-v2x/src/main/res/drawable-xhdpi-1920x1000/v2x_icon_route.png new file mode 100644 index 0000000000000000000000000000000000000000..bff6a53df5fe206f616d1b7892518fa79eb736ba GIT binary patch literal 18544 zcmV)*K#9MJP)Pyg07*naRCodHod>uzMUnSq6;wnK1OyR5l490f6a$hB7*N-=rd1@lt^qNCt_cxP z44;ZQt>79lt_y2G#RMpeDC?>SisYyy$q0V`-`x4nTc=OYoSBo}doNSZQ@5(Cs;jH2 zr)PTR%sKZKw^**Q%B&Lm+u#0X->V32Vw_veYB2d_Fb`M^GuB{=dTaIGOL$8mKA^iR zgKI?%e^)ZA$o?kjs#I;zNY&|sGQe>h#Di5-j-QAl*{=o_NVLjz18FYE^MBRx1Jc;x zzUq8ww3PmZYCqLB(mzJBTdQ4+q4u?{22&?z^iy>@Ob%*6wnt0p%pY4Cs@p18j~q;$ zozbh*;i}qEfal|H zVZK5#$T2rKuB0mA`f9H!0p%-#mFzMMM%9vF&c!eVIb1QqEpG8K>F+39OJXQ~8O)i9 z9X%M4ZCY5Cf8^{bVW71n1}_xuA@spuO8+XMijgn}L># zI-|c+>Hb`{8L)uDksBF`;jJ|Yr2&XI!qe4wpzuIBzcMOHp8li8C^A`1gD?l*79K5J zTlg$tgyI~S8H7rlBP@$9WE=(aKd0ipvxs_35~U6p~_M`Dly14)K&`c;sYrBKND zPNjwQN2pzN)&LK$dS{q8kZjkDCU#cIWV}wT3@74aP0QgY_10_o3GBkBhR z!f;@)av)?L=pu{^(tlX|HbR#uN4HWS1D7B7AE0u!p774#fFje7%~yqg5S}S~N5*7G zlxDVmX`$d&Ie*A{LIGtcK+$bbvIH>of$&`oCO*zpJnvyQ6^MiR)HP7rsf^M)=~@9D zXlzQWsi>H)j+*Q>z`&eq>D)NhKyvg^4HVB7T(6!J2bYZxHrD73od#0p56M||t_y=z zGC6%R1Im^yU*TV}>st+^PVZMIoD~k$ad+_pAe;Y`z*+uC{JTp7#uz=292{x~8sJ4` z=UO8B?@CEPTzU=@0;_n^7Ml6LMU-s@DLk&S%A-W-^Up%EVT|U16kRbVO@qj0E8!D` zKymvc`)%c%!MMH^gVAV$VovG|781EDL7iB-=&EPU>!=%^>IB5FRDGqmT_|3U8NSotziR&k~+zUF{sn zh|>6gAlmN_PPk5q)pl3y7YmOQo*?|W zu!AXSZ)bSskd2Ja zvfW7J`@&){*^WGf<3N<7XshGEjh5sS0}&a#;M|@nO$VB)^XRN7m1=(1QmCq}a&|Q6 z`Q=;z&3v_Zoad0hip5An0%_cT)1h3Q%TncH%w-@ZC01SRq^ROoQh&8!CA46gQ~_|U zdY{mzI;fGc&1dxrl;`vVP$q?agdz{wUypF=Nommi^TUBFI;0C*&|NyZi%X2i+T ze!7CbT9m6+vE>(wyaMUjp$`fx?HG&(;?8O)5e>BG814vsGxhsG@JRyr=Q6OnFkXwQ zFZR`;cU&*ipYiSmmKUS5^%vI)Mh@*4Kxde04v}H_hI2@g#hMPEU+E_%JJ61j|x97{G`zLfUP~L51*Q( zcg012$=@n8d?$4(1)qHVO89HxZ-ldXH2QZg=ZywEY6BL2Cu`wI#jjsx_gAUG|q4Q-t$uVYmo;o5K?h&wvw4+n375I%4os z60u2!g`~wF1$rBq{fE$leOG*S1`@xq@Segi2Qv4xNzB9B5`UV|Vmj_wFYWy?A zxF9@bzDu+js&Z7;@p5u)nV75fB-yfX&nWw_2GBLZ;qr52lR-|WanF*xN=W=>soki7 z2khl=4GH2JVkYq6LP&ygKtc)WYc2Z!PS zv`R|Om{A^+7-GNMO86Ne>jq@dYc<%;q6Mh`gT!z$_?_gZFG$<}4armq$&a564LORz z4Ji@G;hlmawU_Ve!{5VYw~5dLvw*SxKiTXd+6gr7S?Yi<`!j!6`73tgbq>=Y2khi{ zol=n6k<3K{#-X8pKULE~(ARt#VC%NVtDTuJbit;PV}Yvct@X20c*D z*#vuonr>KWAE}w}ZGSEn9+hEd7?>S|Ljqe)gDQ!)%8&PnBw}P-^G+~rzfH-Vn8qQW z@vhoxna=1V8b;8d`-p5VtP3^`zN!5@1zSB-2??c>!M9=lnhJ?$BG7>EmxHDNJv-cI z@f?E(FC*<0Y;nsk|JbrrhGLgZ`)}OHK_h4&o=F@eWIzUsYveo)#sig+AU|K15kB1C z1>n)vqj4acTSH5z5|h5&w|d;Oj%olt1>9HYN;`=E(IB;7XQ}gtTt5Fhcf0&=}jP zLEwxDePl`Di-f33XV5?&QYSm*RJuoJCkt=LGCue{`6zY+^8F08zf}4=Q?v-QY(tQ3 zA@umnDto*F5RLBR5(*Evs84q~KoDy7Qpns%r8z#C?QE2rC#gThWrinrfxV z&{h}=pH_^shMrqGB`KVB1_j31s?FHNSx@$>%bo&wyibdNq0lkhD82v$U13vou%k}> z6&Pr~;=hf8E@?8fjVFmGxIKgbyfJMf->TGG z2Q6Tngnpr(IHfPN7L*9z`{BA0ANZfDHi1sw0UT0%V9T=Lz~6PKq=tF zc&PZNDFGHSix+s*0=dN(OBxBg4EB9ogE-smUGgHu+b0g3HsCg&ykCicqKSA7O+BGo zX#lPd1_q;0>spY|wbg!liSezIVzO_GxAv((%;UX6*@jf z{7%9>gDkSU&`>Z(MqwLXW1lTM#$@cFuMnZ=1ajyz6n(uYan8Dc8oBs2!D&s(oGwX* z@p*$~06HZkhij>~1AeY}`a3aZ1VDeZkOf@KglGiM&hMgd6tA(rCL6}We=)9R_}sJ~ z%2p7PiT0e5Hy1iFj%jYfd?p$=zL5i64>gUwgSvf&uEHWI`AFZbkZQr8V4D8OA!nut zu@Kz9&}M_^$`wh`L49v0@?asS-Q$sU0rh7c?k{8v4sqyz$=B|pLl6TSQX&Y+q_%Ez zx5yo4HA^MWuaA67{Mewe&sOJRMoQ{}tyAaJL1p!FNJTga06E*M6!bMHW&1;sI5_s~ zgdc*w3&_`VWY2ae`Wu-HW8{KFUVt2@m5BCSH;TK&VE+^GMIxd_0HJ-9?B8hH9MyQ7 z`PglweeubAM|a8fi?SGClv8oup+leA(Eh8OUoz04Y^WcnYt{{RKIUENaoam-ykC_= zG?Fyf%2L&oL^KK)-dYN{SEzc$>e4rO%@x@i0eb!!a$(zRL%|qL?~=Ez=csb zikGjGWs?S*ww<7pKThL3eU$H zXpC~}qYOLCO|Achn0Kj&xlik{$%0}Vb#tBeNBT*p9;zcF}0w086%x2+k1SsP5Hr)>ajF&DG9zAcc74%A`%CQJ60&c@2w;TF0hi#4HWM_8Z5rR87GH0V$45N z`?W%Llm_SH_7GKm#j7GC4TpNpK%j)*U%HKnIyR`~`z!GCW)Q+eE*1Yb#KCjn666R>LTt&&rT%nkOYvd~n~y z>UaW;3^?yXrJS#V84zYV%}k_(UMc6Bl>;~#nw}Wwn-u8OZZ6BQW=@pbk2Ofl$vl%} ze!H4L&=;WGuY_?y7Nm3ft0Z`RjtO$W#9>6nMRU)UF+qxrFB5Doxm+PsRjx_s_f#y}j5eYwVMe6%B*ritRWkw1q`9cWzMnP&{=8Y$hrF60sr z;Y#_v34se1l{4WLDCcMwCZ&pJwi85B8iOq@M?Uu}ApDPnZGcmB4nCR_TBf`?#c@CP zZ6SH5xzm1{FisrxC?-hq`Aw3>T2Dy8xgh6q4bs@ae+ro#fuU=Xe3K(jPa?R^+(&IHjCC-N{noxLNauw~4i8vgr1iFp3!iLrgrmcL7fyVQTqk+Ypdc6W95B*g&X zXL7Tu;^DW`cS;%(

?R@aIBe2G-CR3*7Ku+oYP`O5i$}x*oO8=CzV|6vFx00TH}| zL_Rf8;odH1`?YY$b?|jUKcr3j5No>Qip7t7Zn&I&O&L0G^q?mvXJ7c8*Cd^((e5lH zKnDW_{iQ*%-9eLb5B1uj?8(u7_Zlxhko+l$&M_c$pcQrfpVkB zx8Q~fA^EDZzisG)k4Fg&8;N?N!##y3GZ(|oLHLEhw_*2} z(J4a4=k&#n>^{Oe;9lipbxO&dhfVOwce-;cl>_lK=~oN==x-l<*V|_Xi3h<(gVGtb z6zG@a+G9eQ5YRFv(!AIK;2wg5eU-By3K;P_`6=< z$7O%3jzMfQ`X36j3*2tPAWpakT*@CS&0wa`aYq{Kiw zZX{>}s|({}{m&QD_J2;5X|*9xVFupjY44`JrSfKH_*7xc(fLplKJM6flt*_MWjB^y zL2~qi={P)r@J`G+A6ag{ST=tWM%Y}9%}N2MolgtdT#N!vHD}pqP7`#t#&a&@1~^A} zK8k2{vu!7Ini^p^J@KDE_4K3kcHL+e-)&6 zUa6N+W1xSG@I}HKgtkwUbn=f16GTmBEBv-!$+nbjta?^6L-k7{aka9iQXniORYd zjSF@-R(}P{U3!F3{-U01Ot!%Cdx)HJALK;cFSb+ukFwuOKC_SeV~|~W#WU(YCl}wu zljAt;-0fCWLDMgtAom^R^BNVhc%RH2>Zr!yu@Co7_^d;^*XbO~>9RRSc#`m<5;{Fu3KYZh=k-qjf_vkzhIEmJMRXBp=`ZKEUkY1BRfyM%jyS+NT zLukJ)7VQ)zs*0KFX3_sd<@R_6odr1HR=&#>v`#Q?(;pjt+VASnZ(>%lyhl#97vkS> zFmdKBH~RGZ&s5^f09g zG)|IM(V7}3u9nE>LeTt-|3kAmhrMj{dv~|1DN@~Jr5`QSbnnGoDp0$Uw2E#kM|G1C z$Ea+yiWbd-&luoR=W8cPiN&Yd)kM@JjQ-Cxx?bE@pszq*fxZHL1^No~73eF_SD>#z zUxAff0o{l4qaLGfZHh2k8LjMumc#f>6QYLzjSr)nZf2K5ZB}XyO%oFWW1%!oQooWy zwWh&#n3y;muN>D-RKJp9sb3Vt>JSOjfBv2k$t0C6{u>-GR$R+FRxuv(raj75z+$;WoekE=gTh1`$M zZ9s9Z+Qv>c#0T&{lm{meeFEIlhVaCZQ97)=dscw$Wc9JHE2Xi=VuaofLbFP%$q8qgEb~caZK2JN(qmfzt<}%PGK_x#l^P>A1ZVVjAcGY(LYsj@l=DK zQscA=VA}+RUj29?QoyJVwwnu8BJb2dw-GunXdM#Mt6c;d^8m&89*uJkVHy|1=T_H~ z72_4^M_zT{d@KE;oFpZ|X@#F1h>5}jE(km_t~FCTt>Lr_C{}iwUlcknQ{1F6quWUs z9}yuN1$@t|_^xpq<5A8g)+_0k%gGi(#{{LrcN`}DbWXM08bDBI$lvbV?q@Fh6b zNL}NjY?RPw3vY10>S(oMu2d7mj^~BK7@UJ97W1d8Anf=S9Vo7!D5$-Jj@2~AO2PTQ z*FL4tHqbiYNksuoMz)z5)g&D%=Ohq=c1))Kr$W4cW;hp5&ewA8m5LuIu>&jSMwQf4HJHaw1EdY|J9mqIf+(8eyhLPASlR+;%+EQo;V@X{ zK9&zqI~fqpx}gaos2zn4k|E8T^80Y?_?8SP-qRH9fkJXHn0H>t`E5VTZD(q`YHljV z7IUI+3*$Jb0jh-gAaA9E4ya>=5!Px7N^yTjdLFdKd|YQ_@Xr%Qh_+E)@a{aMn3X`; za_8+Q3XGoyNSlYMD+Ltan!<+(A17obKP(A^(^?~FqMk20ZjZ8{i@Xd|Adb`G{u zzq{lVmMM>O#h)W|jR*3Sob~}FwNA|nil+^Fn_9e?$2&gk%^fn;3=#o-I}twJXIuZeBD!s{}eIZLddSLr~v}N z6IAepWDb9n&;}ZY4M8qYit{4{cK9qqQ4E{P|2>4B3{ztIgT_BOH@^B+7x6^@L-pA{ zkqtD}72hWcIn_INY#5t186#4^6!Z;{jtWr zXvDZrls@;rEw&rckGz;;CV435vTyo>!$m!!Ujm&MaG`ae4#e$w#lS%svCRZg=(>la zBjeWmP~*3jhU81zdAkn$uB~O5Ue6!HJSWKkMe4u~cR(|yzn6bc5~rV$D`5)p@NXfG z5xUmS*%Wzt<6eDq&iL*KKQqwL# z!Wi5m?Iz6KLeCB3T$JFy?M6bS(w)(5lD&zq+D0LshN#%OrZ+M zP2!)%?B3Mv-cp`bt{UuID4ayqREIzzsA zGQU=dTw6G}V@_&TV7Y0fC>hI5nFCJ4>!*fpuZ)$%*aSF}14I+Fv3z&E&RwZKzZL#b zc$Scf_;(>dtZiVFohKzy{4znv(#;0C0_HhM4CnwCMsHsL+qa=-v@kkfHZKzXsI>hj z(M?JovYwC+0Z*n;1LV>KIepAO)n|8h3^0?UITLvroZCEooLUU>#VTlmBc$X*$E}2( zAnd;=mHSv*qeY^EW1Aok@pmHru#yhAZO=3>8eFudupB6B#}%E+C1`3 zlcdRE_3)AhTUMSP@Ms5re1e*T&q>I(nQKfPIG#&oFz^IgZC0T5&?acIW5Su7bOjZ2 zpj(k&)H$BlBwe5YVggPUx@BE(mTOX072W}q?8(CDi;t$crqlt?>HxO5n-$z(f5(Dq zbD^JHdyL{egR)a4%QHn5gAXpXN1Oh5D@U?$B^knb~QM2ZvXc zgL|!*=eUtj`b-LU4i3`O+&88BKOs9gKEAHLR4jfXP|mx{f#Zj!eAE41G4|Xhsm%0R zQ7+=SV3F~};A|n_WENVJ|GhG}xI+B5gg?>2!^F%I-dsA5XD#Qi;aB;s+H(ir25yki0l_e?<{+LPtGsuV zH}2(}56)xkv>(BrHh`0O!HB!`^hQb@=8qzt%D`9QIrw)r=R z|E-WOY%wuBHu`&!4d4T?z1~&G{mA)3u0Qb_q-Fs}$xqvR8~5o%72i2!2Xd&x^}592 zVsr|m$yhyTCjq=nMtKE*5Z3@IDZsA5%WB zN7xozh_?2PcI5=M^@$xjx!gtp-Cu=J@VQFtJkbg?7N?a*3)z4)!Kvyy(^DLSD;`e2 zw-q|(NHJl8I3sLGqYL0@Dxe_O9^t5NtoN&*PhTX$7bxK~1MPOvsCu4A+Hrg}TCZ@}nTR4_Ynh)W)}MzO24nD{d4P35lXh z@xPSlJ0xEepu9P_yuD9jP1`#u_LIj6+yxn@Z_!7Aa@z3(#lY%(=4?1^@lX>TklI-O zB#rmo1(TKgS8;G%IiZY#I>wmIJIH;hntA;w4B`ok6Hs}PI}I361sCa8^H#lFhLaqzMLUy{uI zow!%L+op8qT6J9XGYej^ake-{c(>BOW5`iVkh7!QmBu81qp?6i^QI2hBEu+O1NwA= z>_mR~7~wlY+t*D{s(-h9e%^kjMHSCx^2IfiGX`UNT=RAGor>oW*-s1}u(Klt@1UFd zX8qSqkR8c4{eCQTe`rKZeL8`UIzEy(L}MI@VjR%;TdLoF!kxMEcM)_HXn#YJ#F8jdQr#Ta>a~fjl{w)alvM|4{e?;n_kSYI2(8b1kkf zY~3F!Wb?9-&^{xTxSEJ4Hy`zzD#yPdm=-WdCs5%iM!Y8)Ut zteXgrk<-%^Ibe#tu}*_j;l55=mk_|__ z$954T#my*vw2wS}V>|LqI_$PrZokH87T|aogZQCxWBK$G4&+eZ7Si+XZSb+kXNxYnKJ1UWcpE6^mZBf}Vc**LBW!nNp@HAZ!Q_-$);Q!@v}x2*1)ox*pBsGoxyN zn=zA}ByAd24K>M5O3=f$u}Ql0&9)WDPLewFf?`wQQyuSd_t00MuRvdcz5;y(`U>#zUx7tjftuGz$BH<8L^_s}zEfX;#aw|l3ue-{ zMEixbn2&%ywoVmjvtXJWPO_NlKJ056uh;bzSg945bipY2x(mqIFZI?rT&acX2k$Eo zD=@*r>3n?asx;OcAe{$_3HE$nfq7M+W-)R6auu2MIF9}KorKPdDLR-}P5N>A3XD|& zEhhhdL)ZRYkMo$`;;`_K%AT zn>PKUFZXdjwm*Lm{#1CZ4!p}Sm^t|e3(j9E3=JhlWo+QcRy3hBaM7&N4suu(~n<>I8Jzs4#eLgm^P?}#E?E1 zh;dFjq9LTj6Y*=g1E2dKcO*;P*=Mlo4g#H;V>YvVm+oN>qTJ*I&ZNP2!_Z2AB zxovyefZJ{QV;`@QX@A;)eV!ry%fjPzV0QkjM*W6Bb!Gf?F%8*`5IDX%GafuNZt+Gr zsB_%QM^vCZTXMB|vXK8|47lD<&dc$wY%DWP zZ7qia=%bBgrcr0!)HYC_7Jftr?tjy01LajIt^cU5aqLmH=($(QUX{8!YBSi)!bTJK zASL>2Ay*;5wM^-PcJLs}*`zYJ)BfpM{!$rS5RgaJAip$tohBapT2LMweB{7m^t%My zP&`i!*AN241A2VRQfiyH^|Xz3P#|Zspjn|KmjjgtPX=p2dEhhtjvTfgr?y{9h5c|< zx<1#(202|XODdqr;(*&rxOu6HXTVrX__SSi8Is%16g&6#BH*dl3BuoKB3Ih~k|+<> zO%w-D8y_jWyAa65zMyHRYw92Ue@zXpRIZE1D5&CNdl$FV1Ns(?7)PCX_T<#2W1YjB zja(D7u9E#%A^#T7;M$oYhmY+jWAbwgFWR$h@FU|h>AVy`_2J-UaXm@Ml^Sqfrm3t> zUUUxq(|)v16uw0Z>KYn`a-py0c810=GwN0%ws%9HD^0_3tI?ODktT*K&x?e&7RFk^ zyKO2_CmH>&6CNY{wkBs;{l68}Ze!*34B>V{P9V8DNnFUSgL1-wMwyybJMw3%@oLqM zw=W9NxNPqxxhj>O3gQ@|jO`usHUK%p0fU=kLzBT3Xdj^;Te}RoJ$+h3x1r|UpEmb1 zpVefXV&QV9swa8xEZj}VJy)zt%DZhU^UB^bQ|o>$=2fccwHk{#YPu@X#}NHk)`niI zu~_gGjO(a!u$&l80{>d=sSW5eq}YK8jXKxS)V8+ahMB!R^kxsL^EN8NtA(7X zsFCaB`dKDb0a4y0`?i#C6S9Md;QmoIE{`wnlLoeT(;Q&jz!pV6O)mf7o;MF%6I0@Y z2fe7QOQ~(4eCF^O75sP_Jq%YsHD?R9yO1qltflKrC*;<-4F#gkHqe8FKM+m=_LuX) zebT^ZN=?Q&2g^>T$z&V%8X-^Q*cL>H^?^^@*rqbBI`37Xc`V&S%L-^7?kiIk0RNgR zttnpG*59_Li+QOq`?wk-K^$j6((W(!NxVx~!MKhp2TPeLuR?r~3b+<2UC<6rWX|SS zGW@6t+%$3a)zg{^XinCb>K($3N)y+bX6_!fG#grIe&BF`41QpvF=>ne7rc9Sb@Y`Q zMBTFGHCbGJ-XOeVNHW#}K5g4Hm2>9%fBgb-d8R`(M|?Q^LE&0L*SyWV*e32SekLEU z6^;UrGs>=CNaY0Wr%L&Z6^rLdh=sI_eS4f7wr+3N0_wMLv078+HD7!#^-dv=wbQv` zG|!KDDB$^p$L1p8KMRK*T}###H0^``c{~Qz)!CA>*QD^Y=()nW;=3NEJ69}|8_wHo-~RI<*XF*y0{5;}T5ppo~33NIvdJ_+)q z?FGWKgl)inhiq@Q3rQ2f=NL?c3r%t2B+v$2yqt~)2?wc&H{1Il)$!J<0q^DUmdAR+ zgN0iQo8W(?e0X~BHFe18H1@`le^R)5(0jfR#X0jrvOH2ALY!RMBku}q?XHTQVh~Zj ztawepPDh0fOn_o9k&=bqYpRmJK0Bc zlzCH%_ih!gZPBq`GNAgfNH!F5bI%9Tz7Hh-QTSfjaFyr+2dI{B?$RM=tGIWQd@rHr zDWx$FT%>wrFA)9#CV=gNXo%%=q-&$JO{ZwTq<9sZ8`a&*pvg7nYu*&I)P@_=*Q;ok zqg)Q4ny@X}LdccI`ML(N9eGmcz)bCUQT2@|JHiK5Q?^$VfpU4M9K0_$aeQ@GBkSn` z&sCD0%AbT?fHxZkw)fF-7e|ZURz<$Of_$4Wo|&9)O35dc@yYeRD%g^LnN+plasLB_ z)FkGa)&^aQ5*4y&%NOr1EOA}Y9}E2rRk5w$zXFN&SrO$Bv^mBCVFRABb+cPrzMd8WMErgY& zT$@npLeEL$98k5m0$~m`4%C~TS2H^}ys-%m8?Td6eujxyv!T!5=loJ(YGJ7;8o zhx?;}2Mu(wqtV@$kcA4%SHB-yhV0^T2Ju-Hm2)?>jQ0L2)>#OaDyRnJ z!2!lW4nGPxX`CiJSGjW{=?oh41a%tq1TXq!PBzwfXGh^UyvBaE`n^WzIVN9&c~j)( zq2NBke^SQ@aOD5s^KzVC}`ysAM zIpoaEYfWEMzF!f3UwF1~tVJY0z&64zi-Ov}jE+-)ugM2*FaU8*J@3#ck34-|$)5zG z4Lpy%hZYfiJV?@iNjLeHCP3n`c$T?1X&X6T&+7FrQ<)r4;l#>djkDd6MWbDy@6-%a>

5n(q6!9{)KyY3b{J(# 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

dP>ulD&gOrHN4T%CV{jITO<|Y@{7r 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 LNkvXXu0mjfi**?n literal 0 HcmV?d00001 diff --git a/modules/mogo-module-v2x/src/main/res/drawable-xhdpi/v2x_icon_route.png b/modules/mogo-module-v2x/src/main/res/drawable-xhdpi/v2x_icon_route.png new file mode 100644 index 0000000000000000000000000000000000000000..bff6a53df5fe206f616d1b7892518fa79eb736ba GIT binary patch literal 18544 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

5n(q6!9{)KyY3b{J(# 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

dP>ulD&gOrHN4T%CV{jITO<|Y@{7r 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 LNkvXXu0mjfi**?n literal 0 HcmV?d00001 diff --git a/modules/mogo-module-v2x/src/main/res/drawable/v2x_to_nav.xml b/modules/mogo-module-v2x/src/main/res/drawable/v2x_to_nav.xml new file mode 100644 index 0000000000..bc3c6b0bc9 --- /dev/null +++ b/modules/mogo-module-v2x/src/main/res/drawable/v2x_to_nav.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_fatigue_driving.xml b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_fatigue_driving.xml index e6ffe54e9d..2eecb6d0f8 100644 --- a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_fatigue_driving.xml +++ b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_fatigue_driving.xml @@ -30,7 +30,7 @@ android:layout_marginTop="@dimen/dp_20" android:background="@drawable/bg_fatigue_driving" android:gravity="center" - android:text="@string/recommended_route" + android:text="@string/recommended_Parking" android:textColor="@color/v2x_item_white" android:textSize="@dimen/v2x_recommond_route_size" app:layout_constraintBottom_toTopOf="@+id/tvAddress" diff --git a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_recommend_route.xml b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_recommend_route.xml index e6ffe54e9d..047100fa04 100644 --- a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_recommend_route.xml +++ b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_recommend_route.xml @@ -6,18 +6,15 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/v2x_alert_window_bg" - android:paddingStart="@dimen/dp_62" - android:paddingTop="@dimen/dp_42" - android:paddingEnd="@dimen/dp_62" - android:paddingBottom="@dimen/dp_42" + app:roundLayoutRadius="@dimen/dp_40" tools:layout_height="wrap_content"> @@ -27,7 +24,7 @@ android:layout_width="@dimen/v2x_driving_width" android:layout_height="@dimen/v2x_driving_heigt" android:layout_marginStart="@dimen/dp_30" - android:layout_marginTop="@dimen/dp_20" + android:layout_marginTop="@dimen/dp_56" android:background="@drawable/bg_fatigue_driving" android:gravity="center" android:text="@string/recommended_route" @@ -43,36 +40,23 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_15" android:layout_marginEnd="@dimen/dp_30" - android:layout_marginBottom="@dimen/dp_20" + android:layout_marginBottom="@dimen/dp_56" android:textColor="@color/v2x_FFF_333" android:textSize="@dimen/module_v2x_event_parking_text_size" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/tvAddressDistance" + app:layout_constraintEnd_toStartOf="@+id/ivToNav" app:layout_constraintStart_toStartOf="@+id/tagEventType" app:layout_constraintTop_toBottomOf="@+id/tagEventType" - tools:text="停车场|服务区地址" /> + tools:text="前往 xxx" /> - @@ -81,6 +65,7 @@ android:id="@+id/ivClose" android:layout_width="@dimen/module_v2x_event_button_size" android:layout_height="@dimen/module_v2x_event_button_size" + android:layout_marginEnd="@dimen/dp_62" android:src="@drawable/v2x_selector_icon_report_err" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/modules/mogo-module-v2x/src/main/res/layout/window_test_console.xml b/modules/mogo-module-v2x/src/main/res/layout/window_test_console.xml index 34662993f3..6936631ec6 100644 --- a/modules/mogo-module-v2x/src/main/res/layout/window_test_console.xml +++ b/modules/mogo-module-v2x/src/main/res/layout/window_test_console.xml @@ -218,7 +218,7 @@ android:layout_marginBottom="@dimen/dp_10" android:background="#3100E2" android:padding="@dimen/dp_10" - android:text="触发基于目的地预测的道路事件" + android:text="触发基于目的地预测的线路推荐" android:textColor="#FFFFFF" android:textSize="@dimen/dp_22" app:layout_constraintBottom_toBottomOf="parent" diff --git a/modules/mogo-module-v2x/src/main/res/values/strings.xml b/modules/mogo-module-v2x/src/main/res/values/strings.xml index 4a6f565066..386b36333a 100644 --- a/modules/mogo-module-v2x/src/main/res/values/strings.xml +++ b/modules/mogo-module-v2x/src/main/res/values/strings.xml @@ -13,7 +13,8 @@ 诶呀呀,没有查到前方车辆直播视屏,过一会再试试吧 已为您打开路口直播实况 诶呀呀,周围没有可用路口实况直播 - 停车场推荐 + 停车场推荐 + 线路推荐 26px From 842aaf41d08119ef3bc89a741333c843620d07c6 Mon Sep 17 00:00:00 2001 From: wujifei Date: Wed, 30 Dec 2020 17:58:00 +0800 Subject: [PATCH 36/51] =?UTF-8?q?new#=E5=9F=BA=E4=BA=8E=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E9=A2=84=E5=88=A4=E7=9A=84=E9=81=93=E8=B7=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E9=86=92=E3=80=81=E8=B7=AF=E7=BA=BF=E6=8E=A8?= =?UTF-8?q?=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/holder/V2XRecommendRouteVH.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java index 1a9e694a18..7ffe211347 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java @@ -8,17 +8,13 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import androidx.annotation.NonNull; - import com.mogo.map.location.MogoLocation; import com.mogo.map.search.geo.IMogoGeoSearchListener; import com.mogo.map.search.geo.MogoGeocodeResult; import com.mogo.map.search.geo.MogoRegeocodeResult; import com.mogo.module.common.entity.MarkerExploreWay; import com.mogo.module.common.entity.MarkerLocation; -import com.mogo.module.common.entity.MarkerExploreWay; import com.mogo.module.common.entity.V2XEventShowEntity; -import com.mogo.module.common.entity.V2XRecommendRouteEntity; import com.mogo.module.v2x.R; import com.mogo.module.v2x.scenario.view.IV2XWindow; import com.mogo.module.v2x.utils.LocationUtils; @@ -26,6 +22,7 @@ import com.mogo.module.v2x.voice.V2XVoiceCallbackListener; import com.mogo.module.v2x.voice.V2XVoiceConstants; import com.mogo.module.v2x.voice.V2XVoiceManager; + /** * created by wujifei on 2020/12/29 20:39 * describe:线路推荐 @@ -55,6 +52,7 @@ public class V2XRecommendRouteVH extends V2XBaseViewHolder { mogoLocation.setLongitude(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(0)); mogoLocation.setLatitude(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(1)); getLocationInfo(mogoLocation); + registerUnwakeNavi(); } @@ -73,6 +71,28 @@ public class V2XRecommendRouteVH extends V2XBaseViewHolder { public void onGeocodeSearched(MogoGeocodeResult geocodeResult) { } }); + } + + + private V2XVoiceCallbackListener mStartNavi = (command, intent) -> { + try { + triggerStartNavi(mNoveltyInfo); + Log.d("V2XRecommendRouteVH", "mStartNavi ------"); + } catch (Exception e) { + e.printStackTrace(); + } + }; + + private V2XVoiceCallbackListener mCancleNavi = (command, intent) -> { + try { + //取消导航 + unRegisterUnwakeNavi(); + Log.d("V2XRecommendRouteVH", "cancleNavi ------"); + } catch (Exception e) { + e.printStackTrace(); + } + }; + private void registerUnwakeNavi() { V2XVoiceManager.INSTANCE .registerWakeCmd(V2XVoiceConstants.V2X_CONFIRM_ACTION, @@ -88,6 +108,4 @@ public class V2XRecommendRouteVH extends V2XBaseViewHolder { } - - } From eb3fd2eea8cadabf1c48fd792065f8778ea1dc3b Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 17:59:03 +0800 Subject: [PATCH 37/51] =?UTF-8?q?=E5=B0=86=E8=87=AA=E5=8A=A8=E8=BF=9B?= =?UTF-8?q?=E5=85=A5=E9=B9=B0=E7=9C=BC=E6=A8=A1=E5=BC=8F=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=BF=9B=E8=A1=8C=E5=BB=B6=E6=97=B6=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=92=8C=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mogo/map/impl/custom/AMapViewWrapper.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index 61a8b483b0..ca6c432960 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -698,7 +698,10 @@ public class AMapViewWrapper implements IMogoMapView, NaviClient.getInstance( getContext() ).syncCarLocation( sysLocation ); if ( checkAMapView() ) { - MapStyleController.getInstance().onLocationChanged( location, this ); + // 避免设置之后被其他初始化给重置为其他模式 + UiThreadHandler.postDelayed( () -> { + MapStyleController.getInstance().onLocationChanged( location, this ); + }, 5_000L ); } } From a588c7f22bebc31680aa85a367b05abf0e346460 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 30 Dec 2020 18:04:55 +0800 Subject: [PATCH 38/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=AA=E7=A0=94?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E7=89=88=E6=9C=AC=E4=B8=BA1.0.0-vr-7.5.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/map-custom/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/map-custom/build.gradle b/libraries/map-custom/build.gradle index e6d6a83127..b7408bfcc7 100644 --- a/libraries/map-custom/build.gradle +++ b/libraries/map-custom/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation project(':foudations:mogo-commons') } - implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.5.5' + implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.5.7' // implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.4.5-log-1' } From 402002bc7fb3ffd90fb10265dc333b18bcae3906 Mon Sep 17 00:00:00 2001 From: wujifei Date: Wed, 30 Dec 2020 19:19:04 +0800 Subject: [PATCH 39/51] =?UTF-8?q?new#=E5=9F=BA=E4=BA=8E=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E9=A2=84=E5=88=A4=E7=9A=84=E9=81=93=E8=B7=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E9=86=92=E3=80=81=E8=B7=AF=E7=BA=BF=E6=8E=A8?= =?UTF-8?q?=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/V2XRecommendRouteEntity.java | 9 +++ .../adapter/holder/V2XRecommendRouteVH.java | 31 +--------- .../module/v2x/entity/net/V2XRoadDataRes.java | 16 +++-- .../module/v2x/network/V2XRefreshModel.java | 61 +++++++++++++------ 4 files changed, 61 insertions(+), 56 deletions(-) diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java index 9523dbfd4f..548346340f 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java @@ -8,6 +8,7 @@ import java.util.List; */ public class V2XRecommendRouteEntity { private List toPoint; + private String formatAddress; public List getToPoint() { return toPoint; @@ -16,4 +17,12 @@ public class V2XRecommendRouteEntity { public void setToPoint(List toPoint) { this.toPoint = toPoint; } + + public String getFormatAddress() { + return formatAddress; + } + + public void setFormatAddress(String formatAddress) { + this.formatAddress = formatAddress; + } } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java index 7ffe211347..7626025d84 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java @@ -1,23 +1,16 @@ package com.mogo.module.v2x.adapter.holder; -import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import com.mogo.map.location.MogoLocation; -import com.mogo.map.search.geo.IMogoGeoSearchListener; -import com.mogo.map.search.geo.MogoGeocodeResult; -import com.mogo.map.search.geo.MogoRegeocodeResult; import com.mogo.module.common.entity.MarkerExploreWay; import com.mogo.module.common.entity.MarkerLocation; import com.mogo.module.common.entity.V2XEventShowEntity; import com.mogo.module.v2x.R; import com.mogo.module.v2x.scenario.view.IV2XWindow; -import com.mogo.module.v2x.utils.LocationUtils; import com.mogo.module.v2x.voice.V2XVoiceCallbackListener; import com.mogo.module.v2x.voice.V2XVoiceConstants; import com.mogo.module.v2x.voice.V2XVoiceManager; @@ -48,32 +41,11 @@ public class V2XRecommendRouteVH extends V2XBaseViewHolder { markerLocation.setLat(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(1)); mNoveltyInfo = new MarkerExploreWay(); mNoveltyInfo.setLocation(markerLocation); - MogoLocation mogoLocation = new MogoLocation(); - mogoLocation.setLongitude(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(0)); - mogoLocation.setLatitude(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(1)); - getLocationInfo(mogoLocation); + mTvAddress.setText("前往 " + v2XEventShowEntity.getV2XRecommendRouteEntity().getFormatAddress()); registerUnwakeNavi(); } - /** - * 获取定位相关信息 - */ - private void getLocationInfo(MogoLocation location) { - // 定位当前位置是否是高速 - LocationUtils.geoCodeSearch(location, new IMogoGeoSearchListener() { - @Override - public void onRegeocodeSearched(MogoRegeocodeResult regeocodeResult) { - mTvAddress.setText("前往 " + regeocodeResult.getRegeocodeAddress().getFormatAddress()); - } - - @Override - public void onGeocodeSearched(MogoGeocodeResult geocodeResult) { - } - }); - } - - private V2XVoiceCallbackListener mStartNavi = (command, intent) -> { try { triggerStartNavi(mNoveltyInfo); @@ -87,6 +59,7 @@ public class V2XRecommendRouteVH extends V2XBaseViewHolder { try { //取消导航 unRegisterUnwakeNavi(); + delayedCloseWindow(); Log.d("V2XRecommendRouteVH", "cancleNavi ------"); } catch (Exception e) { e.printStackTrace(); diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/entity/net/V2XRoadDataRes.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/entity/net/V2XRoadDataRes.java index be15736bda..348453cb7b 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/entity/net/V2XRoadDataRes.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/entity/net/V2XRoadDataRes.java @@ -30,20 +30,18 @@ public class V2XRoadDataRes extends BaseData { } public static class ResultDTO { - + private String formatAddress; private List fromPoint; private List topPoint; private List poiData; private List illegalParkingData; - @Override - public String toString() { - return "ResultDTO{" + - "fromPoint=" + fromPoint + - ", topPoint=" + topPoint + - ", poiData=" + poiData + - ", illegalParkingData=" + illegalParkingData + - '}'; + public String getFormatAddress() { + return formatAddress; + } + + public void setFormatAddress(String formatAddress) { + this.formatAddress = formatAddress; } public List getFromPoint() { diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java index 575f4aa97a..1a8d2f1137 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java @@ -14,6 +14,9 @@ import com.mogo.commons.network.SubscribeImpl; import com.mogo.commons.network.Utils; import com.mogo.map.MogoLatLng; import com.mogo.map.location.MogoLocation; +import com.mogo.map.search.geo.IMogoGeoSearchListener; +import com.mogo.map.search.geo.MogoGeocodeResult; +import com.mogo.map.search.geo.MogoRegeocodeResult; import com.mogo.module.common.entity.MarkerResponse; import com.mogo.module.common.entity.V2XMessageEntity; import com.mogo.module.common.entity.V2XRecommendRouteEntity; @@ -30,6 +33,7 @@ import com.mogo.module.v2x.entity.net.V2XRoadDataRes; import com.mogo.module.v2x.entity.net.V2XSeekHelpRes; import com.mogo.module.v2x.entity.net.V2XStrategyPushRes; import com.mogo.module.v2x.entity.net.V2XUserInfoRes; +import com.mogo.module.v2x.utils.LocationUtils; import com.mogo.module.v2x.utils.V2XUtils; import com.mogo.service.MogoServicePaths; import com.mogo.service.network.IMogoNetwork; @@ -40,6 +44,8 @@ import com.mogo.utils.network.utils.GsonUtil; import java.util.Map; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; +import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; import okhttp3.RequestBody; @@ -676,28 +682,47 @@ public class V2XRefreshModel { @Override public void onNext(V2XRoadDataRes v2XRoadDataRes) { super.onNext(v2XRoadDataRes); - if (v2XRoadDataRes == null || v2XRoadDataRes.getResult() == null) { + if (v2XRoadDataRes == null + || v2XRoadDataRes.getResult() == null + || v2XRoadDataRes.getResult().getTopPoint() == null + || v2XRoadDataRes.getResult().getTopPoint().isEmpty()) { return; } - if (v2XRoadDataRes.getResult().getPoiData() != null && v2XRoadDataRes.getResult().getPoiData().size() > 0) { - V2XRecommendRouteEntity v2XRecommendRouteEntity = new V2XRecommendRouteEntity(); - v2XRecommendRouteEntity.setToPoint(v2XRoadDataRes.getResult().getTopPoint()); - V2XMessageEntity v2xMessageEntity = new V2XMessageEntity<>(); - // 控制类型 - v2xMessageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_ROUTE); - // 设置数据 - v2xMessageEntity.setContent(v2XRecommendRouteEntity); - // 控制展示状态 - v2xMessageEntity.setShowState(true); - - Intent intent = new Intent(V2XConst.BROADCAST_SCENE_HANDLER_ACTION); - intent.putExtra(V2XConst.BROADCAST_SCENE_EXTRA_KEY, v2xMessageEntity); - LocalBroadcastManager.getInstance(V2XUtils.getApp()).sendBroadcast(intent); - } else if (v2XRoadDataRes.getResult().getIllegalParkingData() != null && v2XRoadDataRes.getResult().getIllegalParkingData().size() > 0) { - // TODO: 2020/12/30 - } + MogoLocation mogoLocation = new MogoLocation(); + mogoLocation.setLongitude(v2XRoadDataRes.getResult().getTopPoint().get(0)); + mogoLocation.setLatitude(v2XRoadDataRes.getResult().getTopPoint().get(1)); + LocationUtils.geoCodeSearch(mogoLocation, new IMogoGeoSearchListener() { + @Override + public void onRegeocodeSearched(MogoRegeocodeResult regeocodeResult) { + String province = regeocodeResult.getRegeocodeAddress().getProvince(); + String city = regeocodeResult.getRegeocodeAddress().getCity(); + v2XRoadDataRes.getResult().setFormatAddress(regeocodeResult.getRegeocodeAddress().getFormatAddress().replaceAll(province, "").replaceAll(city, "")); + sendBroadcast(v2XRoadDataRes); + } + }); } }); } } + + private void sendBroadcast(V2XRoadDataRes v2XRoadDataRes) { + if (v2XRoadDataRes.getResult().getPoiData() != null && v2XRoadDataRes.getResult().getPoiData().size() > 0) { + V2XRecommendRouteEntity v2XRecommendRouteEntity = new V2XRecommendRouteEntity(); + v2XRecommendRouteEntity.setToPoint(v2XRoadDataRes.getResult().getTopPoint()); + v2XRecommendRouteEntity.setFormatAddress(v2XRoadDataRes.getResult().getFormatAddress()); + V2XMessageEntity v2xMessageEntity = new V2XMessageEntity<>(); + // 控制类型 + v2xMessageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_ROUTE); + // 设置数据 + v2xMessageEntity.setContent(v2XRecommendRouteEntity); + // 控制展示状态 + v2xMessageEntity.setShowState(true); + + Intent intent = new Intent(V2XConst.BROADCAST_SCENE_HANDLER_ACTION); + intent.putExtra(V2XConst.BROADCAST_SCENE_EXTRA_KEY, v2xMessageEntity); + LocalBroadcastManager.getInstance(V2XUtils.getApp()).sendBroadcast(intent); + } else if (v2XRoadDataRes.getResult().getIllegalParkingData() != null && v2XRoadDataRes.getResult().getIllegalParkingData().size() > 0) { + // TODO: 2020/12/30 + } + } } From b4deae290e2875d2b65e407a26094180d8d9d86b Mon Sep 17 00:00:00 2001 From: wujifei Date: Wed, 30 Dec 2020 19:32:22 +0800 Subject: [PATCH 40/51] =?UTF-8?q?new#=E5=9F=BA=E4=BA=8E=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E9=A2=84=E5=88=A4=E7=9A=84=E9=81=93=E8=B7=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E9=86=92=E3=80=81=E8=B7=AF=E7=BA=BF=E6=8E=A8?= =?UTF-8?q?=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drawable-ldpi/v2x_icon_route_light.png | Bin 0 -> 24008 bytes .../drawable-mdpi/v2x_icon_route_light.png | Bin 0 -> 24008 bytes .../drawable-xhdpi/v2x_icon_route_light.png | Bin 0 -> 24008 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 skin/mogo-skin-light/src/main/module-v2x-res/drawable-ldpi/v2x_icon_route_light.png create mode 100644 skin/mogo-skin-light/src/main/module-v2x-res/drawable-mdpi/v2x_icon_route_light.png create mode 100644 skin/mogo-skin-light/src/main/module-v2x-res/drawable-xhdpi/v2x_icon_route_light.png diff --git a/skin/mogo-skin-light/src/main/module-v2x-res/drawable-ldpi/v2x_icon_route_light.png b/skin/mogo-skin-light/src/main/module-v2x-res/drawable-ldpi/v2x_icon_route_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2325886c8ee50eacaa9f04145a39e0b049ac89a3 GIT binary patch literal 24008 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 Date: Thu, 31 Dec 2020 10:59:19 +0800 Subject: [PATCH 41/51] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=97=B6=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/map/impl/custom/AMapViewWrapper.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index ca6c432960..e8672f9503 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -86,6 +86,7 @@ public class AMapViewWrapper implements IMogoMapView, private Location mLastDriveLocationShadow = null; private EnumMapUI mCurrentUI; private boolean mIsLightStyle = false; + private boolean mMapLoaded = false; public AMapViewWrapper( MapAutoView mMapView ) { startTime = System.currentTimeMillis(); @@ -344,7 +345,7 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void moveToCenter( MogoLatLng latLng ) { - + moveToCenter( latLng, true ); } private void setUIMode( EnumMapUI ui ) { @@ -697,7 +698,7 @@ public class AMapViewWrapper implements IMogoMapView, } NaviClient.getInstance( getContext() ).syncCarLocation( sysLocation ); - if ( checkAMapView() ) { + if ( checkAMapView() && mMapLoaded ) { // 避免设置之后被其他初始化给重置为其他模式 UiThreadHandler.postDelayed( () -> { MapStyleController.getInstance().onLocationChanged( location, this ); @@ -717,6 +718,7 @@ public class AMapViewWrapper implements IMogoMapView, public void onMapLoaded() { Logger.i( TAG, "autoop--onMapLoaded: " ); MogoMapListenerHandler.getInstance().onMapLoaded(); + mMapLoaded = true; CameraPosition cameraPosition = mMapView.getMapAutoViewHelper().getCameraPosition(); if ( cameraPosition != null ) { Trace.beginSection( "timer.onCameraChangeFinish" ); @@ -726,9 +728,6 @@ public class AMapViewWrapper implements IMogoMapView, cameraPosition.getBearing() ); Trace.endSection(); } - - getMap().getUIController().setAnchorRate( 0.01f ); - getMap().getUIController().setAnchorScale( 1.2f, 2.7f ); } @Override From 789d983021a74119afdd5713af9acd45ef201078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Thu, 31 Dec 2020 11:41:19 +0800 Subject: [PATCH 42/51] =?UTF-8?q?=E6=95=B4=E7=90=86hook=E7=9A=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/mogo-module-common/CMakeLists.txt | 65 ++++++++----------- modules/mogo-module-common/build.gradle | 2 +- modules/mogo-module-common/src/main/cpp/Api.h | 16 +++++ .../src/main/cpp/method-hook-lib.cpp | 12 +++- 4 files changed, 53 insertions(+), 42 deletions(-) create mode 100644 modules/mogo-module-common/src/main/cpp/Api.h diff --git a/modules/mogo-module-common/CMakeLists.txt b/modules/mogo-module-common/CMakeLists.txt index e66e013af7..33493ce303 100644 --- a/modules/mogo-module-common/CMakeLists.txt +++ b/modules/mogo-module-common/CMakeLists.txt @@ -1,44 +1,33 @@ -# For more information about using CMake with Android Studio, read the -# documentation: https://d.android.com/studio/projects/add-native-code.html - -# Sets the minimum version of CMake required to build the native library. +# 更多关于在Android Studio中使用CMake的信息,请阅读文档 +# https://d.android.com/studio/projects/add-native-code.html +# 设置构建本机库所需的CMake的最小版本。 cmake_minimum_required(VERSION 3.4.1) -# Creates and names a library, sets it as either STATIC -# or SHARED, and provides the relative paths to its source code. -# You can define multiple libraries, and CMake builds them for you. -# Gradle automatically packages shared libraries with your APK. +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -frtti -fexceptions") -add_library( # Sets the name of the library. - method-hook-lib +# 指定的源文件生成链接文件,然后添加到工程中去 +add_library( + # 设置库的名称。对应 System.loadLibrary("native-lib"); 使用的名称 + method-hook-lib + # 将库设置为共享库。 + SHARED + # 提供了到源文件的相对路径。 + src/main/cpp/method-hook-lib.cpp) - # Sets the library as a shared library. - SHARED +# 搜索指定的预构建库并将路径存储为变量。 +# 因为CMake在搜索路径中默认包含系统库, +# 所以你只需要指定你想要添加的公共NDK库的名称, +# CMake在完成它的构建之前会验证这个库是否存在。 +find_library( + # 设置path变量的名称。 + log-lib + # 指定你想要CMake定位的NDK库的名称。 + log) - # Provides a relative path to your source file(s). - src/main/cpp/method-hook-lib.cpp ) - -# Searches for a specified prebuilt library and stores the path as a -# variable. Because CMake includes system libraries in the search path by -# default, you only need to specify the name of the public NDK library -# you want to add. CMake verifies that the library exists before -# completing its build. - -find_library( # Sets the name of the path variable. - log-lib - - # Specifies the name of the NDK library that - # you want CMake to locate. - log ) - -# Specifies libraries CMake should link to your target library. You -# can link multiple libraries, such as libraries you define in this -# build script, prebuilt third-party libraries, or system libraries. - -target_link_libraries( # Specifies the target library. - method-hook-lib - - # Links the target library to the log library - # included in the NDK. - ${log-lib} ) \ No newline at end of file +# 为native-lib添加ffmpeg编译连接库 +target_link_libraries( + # 指定目标库。 + method-hook-lib + # 将目标库链接到包含在NDK中的日志库。 + ${log-lib}) \ No newline at end of file diff --git a/modules/mogo-module-common/build.gradle b/modules/mogo-module-common/build.gradle index 783a180702..23ea152ed1 100644 --- a/modules/mogo-module-common/build.gradle +++ b/modules/mogo-module-common/build.gradle @@ -14,7 +14,7 @@ android { externalNativeBuild { cmake { - cppFlags "-std=c++11 -frtti -fexceptions" + cppFlags "" } } } diff --git a/modules/mogo-module-common/src/main/cpp/Api.h b/modules/mogo-module-common/src/main/cpp/Api.h new file mode 100644 index 0000000000..e61958e771 --- /dev/null +++ b/modules/mogo-module-common/src/main/cpp/Api.h @@ -0,0 +1,16 @@ +// +// Created by on 2020-05-08. +// + +#ifndef API_H +#define API_H + +#include + +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,"Native_RtmpPusher",__VA_ARGS__) +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,"Native_RtmpPusher",__VA_ARGS__) +#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,"Native_RtmpPusher",__VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"Native_RtmpPusher",__VA_ARGS__) + + +#endif //API_H diff --git a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp b/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp index dd5111ea23..477a2c1a3f 100644 --- a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp +++ b/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp @@ -1,7 +1,7 @@ #include #include +#include "Api.h" -// // Created by donghongyu on 12/10/20 1:34 PM. // 源码地址 https://github.com/pqpo/methodhook // 方法hook jni类 @@ -22,7 +22,10 @@ static struct { * @param destMethodObj 替换的方法对象 * @return */ -static jlong methodHook(JNIEnv *env, jclass type, jobject srcMethodObj, jobject destMethodObj) { +static jlong methodHook(JNIEnv *env, + jclass type, + jobject srcMethodObj, + jobject destMethodObj) { // 反射:获取了Java对象的在native层的 ArtMethod指针 void *srcMethod = reinterpret_cast(env->FromReflectedMethod(srcMethodObj)); void *destMethod = reinterpret_cast(env->FromReflectedMethod(destMethodObj)); @@ -45,7 +48,10 @@ static jlong methodHook(JNIEnv *env, jclass type, jobject srcMethodObj, jobject * @param methodPtr * @return */ -static jobject methodRestore(JNIEnv *env, jclass type, jobject srcMethod, jlong methodPtr) { +static jobject methodRestore(JNIEnv *env, + jclass type, + jobject srcMethod, + jlong methodPtr) { // 要还原的旧方法 指针 int *backupMethod = reinterpret_cast(methodPtr); // 获取了Java对象的在native层的 ArtMethod指针 From 56ea4b7d98ed0aa1816d0dac7ffa1eb6664daa7a Mon Sep 17 00:00:00 2001 From: wujifei Date: Thu, 31 Dec 2020 14:41:38 +0800 Subject: [PATCH 43/51] =?UTF-8?q?new#=E5=A2=9E=E5=8A=A0tts=E6=92=AD?= =?UTF-8?q?=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/entity/V2XRecommendRouteEntity.java | 10 ++++++++-- .../destination/V2XRecommendRouteScenario.kt | 8 +++++--- .../scene/destination/V2XRecommendRouteWindow.kt | 15 +++------------ 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java index 548346340f..b31673bcb2 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java @@ -7,8 +7,9 @@ import java.util.List; * describe:基于目的地预判的道路事件 */ public class V2XRecommendRouteEntity { - private List toPoint; - private String formatAddress; + private List toPoint; //目的地坐标 + private String formatAddress; //目的地地址 + private String tts; //播报内容 public List getToPoint() { return toPoint; @@ -25,4 +26,9 @@ public class V2XRecommendRouteEntity { public void setFormatAddress(String formatAddress) { this.formatAddress = formatAddress; } + + public String getTts() { + tts = "主人,我发现前往" + formatAddress + "沿途有拥堵,推荐你导航最优路线,现在开启导航吗?"; + return tts; + } } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt index 23f795f105..35024fa418 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt @@ -2,6 +2,8 @@ package com.mogo.module.v2x.scenario.scene.destination import android.view.View import android.view.ViewGroup +import com.mogo.commons.voice.AIAssist +import com.mogo.commons.voice.VoicePreemptType import com.mogo.module.common.entity.V2XMessageEntity import com.mogo.module.common.entity.V2XRecommendRouteEntity import com.mogo.module.v2x.R @@ -28,11 +30,9 @@ class V2XRecommendRouteScenario : AbsV2XScenario() { v2XMessageEntity?.content?.let { if (v2XMessageEntity!!.isShowState) { if (!isSameScenario(v2XMessageEntity)) { - // 更新要提醒的数据 setV2XMessageEntity(v2XMessageEntity) show() } else { - // 更新要提醒的数据 setV2XMessageEntity(v2XMessageEntity) } } else { @@ -52,7 +52,7 @@ class V2XRecommendRouteScenario : AbsV2XScenario() { v2XWindow?.let { val layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V2XUtils.getApp().resources.getDimension(R.dimen.module_v2x_fatigue_driving_window_height_ground).toInt()) - V2XServiceManager.getMogoTopViewManager().addView(it.view, layoutParams,mogoTopViewStatusListener) + V2XServiceManager.getMogoTopViewManager().addView(it.view, layoutParams, mogoTopViewStatusListener) it.show(v2XMessageEntity.content) } @@ -83,6 +83,7 @@ class V2XRecommendRouteScenario : AbsV2XScenario() { val mogoTopViewStatusListener: IMogoTopViewStatusListener = object : IMogoTopViewStatusListener { private val mainScope = MainScope() override fun onViewAdded(view: View?) { + AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice(v2XMessageEntity.content.getTts(),VoicePreemptType.PREEMPT_TYPE_IMMEADIATELY,null) mainScope.launch { delay(1000 * 20) closeWindow() @@ -90,6 +91,7 @@ class V2XRecommendRouteScenario : AbsV2XScenario() { } override fun onViewRemoved(view: View?) { + AIAssist.getInstance(V2XUtils.getApp()).breakOffSpeak() mainScope.cancel() } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteWindow.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteWindow.kt index a921a2c168..717301dbeb 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteWindow.kt +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteWindow.kt @@ -47,17 +47,6 @@ class V2XRecommendRouteWindow @JvmOverloads constructor( // 配置列表朝向 val layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) rvRoadEventList?.setLayoutManager(layoutManager) - rvRoadEventList?.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - super.onScrollStateChanged(recyclerView, newState) - if (recyclerView.childCount > 0) { - if (newState == RecyclerView.SCROLL_STATE_IDLE) { - // 用户处于交互的时候延后隐藏时间 - // countDownV2XEvent() - } - } - } - }) } @@ -70,7 +59,9 @@ class V2XRecommendRouteWindow @JvmOverloads constructor( return this } - override fun setWindowStatusListener(listener: V2XWindowStatusListener) {} + override fun setWindowStatusListener(listener: V2XWindowStatusListener) { + + } override fun show(entity: V2XRecommendRouteEntity?) { entity.let { From 2224f51f4429132f31c89a005b0a64c959e26c7b Mon Sep 17 00:00:00 2001 From: wujifei Date: Thu, 31 Dec 2020 14:48:20 +0800 Subject: [PATCH 44/51] =?UTF-8?q?new#=E8=A7=A3=E5=86=B3=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/module/v2x/network/V2XRefreshModel.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java index 1a8d2f1137..c782d288a3 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java @@ -694,10 +694,18 @@ public class V2XRefreshModel { LocationUtils.geoCodeSearch(mogoLocation, new IMogoGeoSearchListener() { @Override public void onRegeocodeSearched(MogoRegeocodeResult regeocodeResult) { - String province = regeocodeResult.getRegeocodeAddress().getProvince(); - String city = regeocodeResult.getRegeocodeAddress().getCity(); - v2XRoadDataRes.getResult().setFormatAddress(regeocodeResult.getRegeocodeAddress().getFormatAddress().replaceAll(province, "").replaceAll(city, "")); - sendBroadcast(v2XRoadDataRes); + if (regeocodeResult == null || regeocodeResult.getRegeocodeAddress() == null) { + return; + } + try { + String province = regeocodeResult.getRegeocodeAddress().getProvince(); + String city = regeocodeResult.getRegeocodeAddress().getCity(); + v2XRoadDataRes.getResult().setFormatAddress(regeocodeResult.getRegeocodeAddress().getFormatAddress().replaceAll(province, "").replaceAll(city, "")); + sendBroadcast(v2XRoadDataRes); + } catch (Exception e) { + e.printStackTrace(); + } + } }); } From 868705abc29443189f01e8b1888a8ab29411b5e8 Mon Sep 17 00:00:00 2001 From: liujing Date: Thu, 31 Dec 2020 15:01:12 +0800 Subject: [PATCH 45/51] =?UTF-8?q?+=E7=9B=AE=E7=9A=84=E5=9C=B0=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E5=81=9C=E8=BD=A6=E5=9C=BA=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/module/common/entity/V2XMessageEntity.java | 3 +++ .../com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XMessageEntity.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XMessageEntity.java index f025292325..fce034aab3 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XMessageEntity.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XMessageEntity.java @@ -143,6 +143,8 @@ public class V2XMessageEntity implements Serializable { int ALERT_VOICE_CALL_FOR_LIVECAR_SHOW = 1_010; // 基于预判目的地道路事件的路线推荐 int ALERT_RECOMMEND_ROUTE = 1_011; + // 基于预判目的地违章高发停车场推荐 + int ALERT_RECOMMEND_PARKING = 1_012; // 推送VR消息展示 int ALERT_PUSH_VR_SHOW = 2_000; // 自车求助 @@ -165,6 +167,7 @@ public class V2XMessageEntity implements Serializable { V2XTypeEnum.ALERT_CAR_FOR_HELP, V2XTypeEnum.ALERT_VOICE_CALL_FOR_LIVECAR_SHOW, V2XTypeEnum.ALERT_RECOMMEND_ROUTE, + V2XTypeEnum.ALERT_RECOMMEND_PARKING, V2XTypeEnum.ALERT_PUSH_VR_SHOW, V2XTypeEnum.ALERT_OBU_EVENT, }) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java index 16f7e8f042..f46bc7a74b 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/impl/V2XScenarioManager.java @@ -25,6 +25,7 @@ import com.mogo.module.v2x.utils.V2XUtils; import com.mogo.utils.TipToast; import com.mogo.utils.logger.Logger; +import static com.mogo.module.common.entity.V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_PARKING; import static com.mogo.module.v2x.V2XConst.MODULE_NAME; /** @@ -74,7 +75,8 @@ public class V2XScenarioManager implements IV2XScenarioManager { case V2XMessageEntity.V2XTypeEnum.ALERT_SEEK_WARNING: mV2XScenario = new V2XSeekHelpScenario(); break; - case V2XMessageEntity.V2XTypeEnum.ALERT_FATIGUE_DRIVING: + case V2XMessageEntity.V2XTypeEnum.ALERT_FATIGUE_DRIVING : + case ALERT_RECOMMEND_PARKING : mV2XScenario = new V2XFatigueDrivingScenario(); break; case V2XMessageEntity.V2XTypeEnum.ALERT_PUSH_WINDOW_WARNING: From d582bc3c4172278e9457dd49c45f8a7792c13dbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Thu, 31 Dec 2020 16:43:05 +0800 Subject: [PATCH 46/51] =?UTF-8?q?=E5=B0=86hook=E5=8D=95=E7=8B=AC=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E5=BA=93=E5=BC=95=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 1 - .../map/impl/custom/CustomMapApiBuilder.java | 10 +- modules/mogo-module-common/CMakeLists.txt | 33 ------ modules/mogo-module-common/build.gradle | 12 +- modules/mogo-module-common/src/main/cpp/Api.h | 16 --- .../src/main/cpp/method-hook-lib.cpp | 108 ------------------ .../mogo/module/common/hook/HookManager.java | 67 ----------- .../mogo/module/common/hook/MethodHook.java | 100 ---------------- .../module/small/map/SmallVisionProvider.java | 2 +- 9 files changed, 10 insertions(+), 339 deletions(-) delete mode 100644 modules/mogo-module-common/CMakeLists.txt delete mode 100644 modules/mogo-module-common/src/main/cpp/Api.h delete mode 100644 modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp delete mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java delete mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 8efbfa420e..426ff6b360 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -85,7 +85,6 @@ diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java index 4656d28323..5660221fb5 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java @@ -99,8 +99,14 @@ class CustomMapApiBuilder implements IMogoMapApiBuilder { .setZoom( 16 ) .setPointToCenter( 0.734375f, 0.5f ) .setStyleMode( MapParams.MAP_STYLE_NIGHT ), NavParams.Companion.init() ); - MapAutoView mapAutoView = new MapAutoView( context ); - IMogoMapView mapView = new AMapViewWrapper( mapAutoView ); + MapAutoView mapAutoView = new MapAutoView(context); + Logger.w(TAG, "mapAutoView==" + mapAutoView); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + IMogoMapView mapView = new AMapViewWrapper(mapAutoView); return mapView; } diff --git a/modules/mogo-module-common/CMakeLists.txt b/modules/mogo-module-common/CMakeLists.txt deleted file mode 100644 index 33493ce303..0000000000 --- a/modules/mogo-module-common/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -# 更多关于在Android Studio中使用CMake的信息,请阅读文档 -# https://d.android.com/studio/projects/add-native-code.html - -# 设置构建本机库所需的CMake的最小版本。 -cmake_minimum_required(VERSION 3.4.1) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -frtti -fexceptions") - -# 指定的源文件生成链接文件,然后添加到工程中去 -add_library( - # 设置库的名称。对应 System.loadLibrary("native-lib"); 使用的名称 - method-hook-lib - # 将库设置为共享库。 - SHARED - # 提供了到源文件的相对路径。 - src/main/cpp/method-hook-lib.cpp) - -# 搜索指定的预构建库并将路径存储为变量。 -# 因为CMake在搜索路径中默认包含系统库, -# 所以你只需要指定你想要添加的公共NDK库的名称, -# CMake在完成它的构建之前会验证这个库是否存在。 -find_library( - # 设置path变量的名称。 - log-lib - # 指定你想要CMake定位的NDK库的名称。 - log) - -# 为native-lib添加ffmpeg编译连接库 -target_link_libraries( - # 指定目标库。 - method-hook-lib - # 将目标库链接到包含在NDK中的日志库。 - ${log-lib}) \ No newline at end of file diff --git a/modules/mogo-module-common/build.gradle b/modules/mogo-module-common/build.gradle index 23ea152ed1..e6efc88b0b 100644 --- a/modules/mogo-module-common/build.gradle +++ b/modules/mogo-module-common/build.gradle @@ -11,17 +11,6 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' - - externalNativeBuild { - cmake { - cppFlags "" - } - } - } - externalNativeBuild { - cmake { - path "CMakeLists.txt" - } } buildTypes { release { @@ -44,6 +33,7 @@ dependencies { implementation rootProject.ext.dependencies.androidxconstraintlayout implementation rootProject.ext.dependencies.arouter implementation rootProject.ext.dependencies.callchatprovider + api "com.mogo.libs:hook:1.0" if (Boolean.valueOf(RELEASE)) { api rootProject.ext.dependencies.mogomap api rootProject.ext.dependencies.mogomapapi diff --git a/modules/mogo-module-common/src/main/cpp/Api.h b/modules/mogo-module-common/src/main/cpp/Api.h deleted file mode 100644 index e61958e771..0000000000 --- a/modules/mogo-module-common/src/main/cpp/Api.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// Created by on 2020-05-08. -// - -#ifndef API_H -#define API_H - -#include - -#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,"Native_RtmpPusher",__VA_ARGS__) -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,"Native_RtmpPusher",__VA_ARGS__) -#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,"Native_RtmpPusher",__VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"Native_RtmpPusher",__VA_ARGS__) - - -#endif //API_H diff --git a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp b/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp deleted file mode 100644 index 477a2c1a3f..0000000000 --- a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include -#include "Api.h" - -// Created by donghongyu on 12/10/20 1:34 PM. -// 源码地址 https://github.com/pqpo/methodhook -// 方法hook jni类 -static const char *kClassMethodHookChar = "com/mogo/module/common/hook/MethodHook"; - -static struct { - jmethodID m1; - jmethodID m2; - size_t methodSize; -} methodHookClassInfo; - - -/** - * 替换指定类中的方法 - * @param env - * @param type - * @param srcMethodObj 目标方法对象 - * @param destMethodObj 替换的方法对象 - * @return - */ -static jlong methodHook(JNIEnv *env, - jclass type, - jobject srcMethodObj, - jobject destMethodObj) { - // 反射:获取了Java对象的在native层的 ArtMethod指针 - void *srcMethod = reinterpret_cast(env->FromReflectedMethod(srcMethodObj)); - void *destMethod = reinterpret_cast(env->FromReflectedMethod(destMethodObj)); - // 定义存储方法ID的数组 - int *backupMethod = new int[methodHookClassInfo.methodSize]; - // 使用的内存拷贝函数 - // 将旧方法ID拷贝到数组中 - memcpy(backupMethod, srcMethod, methodHookClassInfo.methodSize); - // 将新方法替换到旧方法地址上 - memcpy(srcMethod, destMethod, methodHookClassInfo.methodSize); - // 将旧方法ID返回给java层,用来做方法还原使用 - return reinterpret_cast(backupMethod); -} - -/** - * 恢复指定类中的方法 - * @param env - * @param type - * @param srcMethod 目标方法对象 - * @param methodPtr - * @return - */ -static jobject methodRestore(JNIEnv *env, - jclass type, - jobject srcMethod, - jlong methodPtr) { - // 要还原的旧方法 指针 - int *backupMethod = reinterpret_cast(methodPtr); - // 获取了Java对象的在native层的 ArtMethod指针 - void *artMethodSrc = reinterpret_cast(env->FromReflectedMethod(srcMethod)); - // 将旧方法指针,替换到 artMethodSrc 中 - memcpy(artMethodSrc, backupMethod, methodHookClassInfo.methodSize); - // 删除旧方法备份指针 - delete[]backupMethod; - // 返回旧方法 - return srcMethod; -} - -// 定义要注册的方法 -static JNINativeMethod gMethods[] = { - { - "hook_native", - "(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)J", - (void *) methodHook - }, - { - "restore_native", - "(Ljava/lang/reflect/Method;J)Ljava/lang/reflect/Method;", - (void *) methodRestore - } -}; - -extern "C" -JNIEXPORT jint JNICALL -/** - * 在jni加载的时候进行方法参数获取 - * @param vm - * @param reserved - * @return - */ -JNI_OnLoad(JavaVM *vm, void *reserved) { - JNIEnv *env = nullptr; - if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) { - return JNI_FALSE; - } - // 加载指定java class - jclass classEvaluateUtil = env->FindClass(kClassMethodHookChar); - // 注册 - if (env->RegisterNatives(classEvaluateUtil, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < - 0) { - return JNI_FALSE; - } - // 获取 MethodHook m1、m2 的方法ID - methodHookClassInfo.m1 = env->GetStaticMethodID(classEvaluateUtil, "m1", "()V"); - methodHookClassInfo.m2 = env->GetStaticMethodID(classEvaluateUtil, "m2", "()V"); - // 获取artMethod的大小, - methodHookClassInfo.methodSize = reinterpret_cast(methodHookClassInfo.m2) - - reinterpret_cast(methodHookClassInfo.m1); - return JNI_VERSION_1_4; -} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java deleted file mode 100644 index 6dc15753b1..0000000000 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.mogo.module.common.hook; - - -import android.util.Pair; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 替换管理 - * Created by donghongyu on 12/29/20 1:34 PM - */ -public final class HookManager { - - private HookManager() { - } - - public static HookManager get() { - return InstanceHolder.sInstance; - } - - private static class InstanceHolder { - private static HookManager sInstance = new HookManager(); - } - - private Map, MethodHook> methodHookMap = new ConcurrentHashMap<>(); - - /** - * 替换方法 - * - * @param originMethod 原始方法 - * @param hookMethod 替换方法 - */ - public void hookMethod(Method originMethod, Method hookMethod) { - if (originMethod == null || hookMethod == null) { - throw new IllegalArgumentException("argument cannot be null"); - } - - Pair key = Pair.create(hookMethod.getDeclaringClass().getName(), hookMethod.getName()); - if (methodHookMap.containsKey(key)) { - MethodHook methodHook = methodHookMap.get(key); - methodHook.restore(); - } - MethodHook methodHook = new MethodHook(originMethod, hookMethod); - methodHookMap.put(key, methodHook); - methodHook.hook(); - } - - public void callOrigin(Object receiver, Object... args) { - StackTraceElement stackTrace = Thread.currentThread().getStackTrace()[3]; - String className = stackTrace.getClassName(); - String methodName = stackTrace.getMethodName(); - MethodHook methodHook = methodHookMap.get(Pair.create(className, methodName)); - if (methodHook != null) { - try { - methodHook.callOrigin(receiver, args); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - -} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java deleted file mode 100644 index 8586ac1adc..0000000000 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.mogo.module.common.hook; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * 替换类与c++代码对应 - * Created by donghongyu on 12/29/20 1:34 PM - */ -public class MethodHook { - - public static void m1() { - } - - public static void m2() { - } - - // 目标方法 - private Method srcMethod; - // 要替换的方法 - private Method hookMethod; - - // 备份目标替换方法ID - private long backupMethodPtr; - - /** - * hook方法 - * - * @param src 要替换的方法对象 - * @param dest 被替换的方法对象 - */ - public MethodHook(Method src, Method dest) { - srcMethod = src; - hookMethod = dest; - srcMethod.setAccessible(true); - hookMethod.setAccessible(true); - } - - /** - * 调用 native 层,完成替换 - */ - public void hook() { - if (backupMethodPtr == 0) { - backupMethodPtr = hook_native(srcMethod, hookMethod); - } - } - - /** - * 调用 native 层,完成方法还原 - */ - public void restore() { - if (backupMethodPtr != 0) { - restore_native(srcMethod, backupMethodPtr); - backupMethodPtr = 0; - } - } - - /** - * 调用原来class 对象中的方法 - * - * @param receiver 接受对象 - * @param args 方法列表 - * @throws InvocationTargetException - * @throws IllegalAccessException - */ - public void callOrigin(Object receiver, Object... args) - throws InvocationTargetException, IllegalAccessException { - if (backupMethodPtr != 0) { - restore(); - srcMethod.invoke(receiver, args); - hook(); - } else { - srcMethod.invoke(receiver, args); - } - } - - /** - * 调用 native 方法完成 方法替换 - * - * @param src 旧方法 - * @param dest 新方法 - * @return 就方法ID - */ - private static native long hook_native(Method src, Method dest); - - /** - * 调用 native 方法完成 方法还原 - * - * @param src - * @param methodPtr - * @return - */ - private static native Method restore_native(Method src, long methodPtr); - - static { - // 加载本地方法 so - System.loadLibrary("method-hook-lib"); - } - -} diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java index 42503d9055..98e6bef0a9 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java @@ -14,8 +14,8 @@ import androidx.fragment.app.Fragment; import com.alibaba.android.arouter.facade.annotation.Route; import com.amap.api.col.n3.lg; import com.amap.api.col.n3.lg2; +import com.mogo.hook.HookManager; import com.mogo.module.common.MogoApisHandler; -import com.mogo.module.common.hook.HookManager; import com.mogo.module.common.wm.WindowManagerView; import com.mogo.service.MogoServicePaths; import com.mogo.service.map.IMogoSmallMapProvider; From 67eff81529b51599bb60b3f474d1e8a8f674f216 Mon Sep 17 00:00:00 2001 From: wujifei Date: Thu, 31 Dec 2020 17:24:03 +0800 Subject: [PATCH 47/51] =?UTF-8?q?new#=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/holder/V2XRecommendRouteVH.java | 84 ----------------- .../v2x/adapter/holder/V2XRecommendRouteVH.kt | 92 +++++++++++++++++++ .../destination/V2XRecommendRouteScenario.kt | 34 +------ 3 files changed, 93 insertions(+), 117 deletions(-) delete mode 100644 modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java create mode 100644 modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.kt diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java deleted file mode 100644 index 7626025d84..0000000000 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.mogo.module.v2x.adapter.holder; - -import android.util.Log; -import android.view.LayoutInflater; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.mogo.module.common.entity.MarkerExploreWay; -import com.mogo.module.common.entity.MarkerLocation; -import com.mogo.module.common.entity.V2XEventShowEntity; -import com.mogo.module.v2x.R; -import com.mogo.module.v2x.scenario.view.IV2XWindow; -import com.mogo.module.v2x.voice.V2XVoiceCallbackListener; -import com.mogo.module.v2x.voice.V2XVoiceConstants; -import com.mogo.module.v2x.voice.V2XVoiceManager; - - -/** - * created by wujifei on 2020/12/29 20:39 - * describe:线路推荐 - */ -public class V2XRecommendRouteVH extends V2XBaseViewHolder { - private TextView mTvAddress; - private ImageView mIvToNav, mIvClose; - private MarkerExploreWay mNoveltyInfo; - - public V2XRecommendRouteVH(ViewGroup viewGroup, IV2XWindow v2XWindow) { - super(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_v2x_recommend_route, viewGroup, false), v2XWindow); - mTvAddress = itemView.findViewById(R.id.tvAddress); - mIvToNav = itemView.findViewById(R.id.ivToNav); - mIvClose = itemView.findViewById(R.id.ivClose); - mIvToNav.setOnClickListener(v -> triggerStartNavi(mNoveltyInfo)); - mIvClose.setOnClickListener(v -> delayedCloseWindow()); - } - - @Override - public void initView(V2XEventShowEntity v2XEventShowEntity) { - MarkerLocation markerLocation = new MarkerLocation(); - markerLocation.setLon(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(0)); - markerLocation.setLat(v2XEventShowEntity.getV2XRecommendRouteEntity().getToPoint().get(1)); - mNoveltyInfo = new MarkerExploreWay(); - mNoveltyInfo.setLocation(markerLocation); - mTvAddress.setText("前往 " + v2XEventShowEntity.getV2XRecommendRouteEntity().getFormatAddress()); - registerUnwakeNavi(); - - } - - private V2XVoiceCallbackListener mStartNavi = (command, intent) -> { - try { - triggerStartNavi(mNoveltyInfo); - Log.d("V2XRecommendRouteVH", "mStartNavi ------"); - } catch (Exception e) { - e.printStackTrace(); - } - }; - - private V2XVoiceCallbackListener mCancleNavi = (command, intent) -> { - try { - //取消导航 - unRegisterUnwakeNavi(); - delayedCloseWindow(); - Log.d("V2XRecommendRouteVH", "cancleNavi ------"); - } catch (Exception e) { - e.printStackTrace(); - } - }; - - private void registerUnwakeNavi() { - V2XVoiceManager.INSTANCE - .registerWakeCmd(V2XVoiceConstants.V2X_CONFIRM_ACTION, - mStartNavi) - .registerWakeCmd(V2XVoiceConstants.V2X_CANCLE_ACTION, - mCancleNavi); - } - - private void unRegisterUnwakeNavi() { - V2XVoiceManager.INSTANCE - .unRegisterWakeCmd(V2XVoiceConstants.V2X_CONFIRM_ACTION) - .unRegisterWakeCmd(V2XVoiceConstants.V2X_CANCLE_ACTION); - } - - -} diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.kt new file mode 100644 index 0000000000..8cac03b737 --- /dev/null +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.kt @@ -0,0 +1,92 @@ +package com.mogo.module.v2x.adapter.holder + +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import com.mogo.commons.voice.AIAssist +import com.mogo.commons.voice.VoicePreemptType +import com.mogo.module.common.entity.MarkerExploreWay +import com.mogo.module.common.entity.MarkerLocation +import com.mogo.module.common.entity.V2XEventShowEntity +import com.mogo.module.v2x.R +import com.mogo.module.v2x.scenario.view.IV2XWindow +import com.mogo.module.v2x.utils.V2XUtils +import com.mogo.module.v2x.voice.V2XVoiceCallbackListener +import com.mogo.module.v2x.voice.V2XVoiceConstants +import com.mogo.module.v2x.voice.V2XVoiceManager.registerUnWakeVoice +import com.mogo.module.v2x.voice.V2XVoiceManager.unRegisterUnWakeVoice +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +/** + * created by wujifei on 2020/12/31 16:10 + * describe: + */ +class V2XRecommendRouteVH(viewGroup: ViewGroup, v2XWindow: IV2XWindow<*>) : V2XBaseViewHolder( + LayoutInflater.from(viewGroup.context).inflate(R.layout.item_v2x_recommend_route, viewGroup, false), v2XWindow), V2XVoiceCallbackListener { + private var mTvAddress: TextView? = null + private var mIvToNav: ImageView? = null + private var mIvClose: ImageView? = null + private var mNoveltyInfo: MarkerExploreWay? = null + private val mainScope = MainScope() + + init { + mTvAddress = itemView.findViewById(R.id.tvAddress) + mIvToNav = itemView.findViewById(R.id.ivToNav) + mIvClose = itemView.findViewById(R.id.ivClose) + mIvToNav?.setOnClickListener { triggerStartNavi(mNoveltyInfo) } + mIvClose?.setOnClickListener { delayedCloseWindow() } + itemView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { + override fun onViewAttachedToWindow(view: View) { + registerUnwakeNavi() + mainScope.launch { + delay(1000 * 20) + delayedCloseWindow() + } + } + + override fun onViewDetachedFromWindow(view: View) { + unRegisterUnwakeNavi() + AIAssist.getInstance(V2XUtils.getApp()).breakOffSpeak() + mainScope.cancel() + } + }) + } + + + override fun initView(viewData: V2XEventShowEntity?) { + viewData?.let { + val markerLocation = MarkerLocation() + markerLocation.lon = it.getV2XRecommendRouteEntity().getToPoint().get(0) + markerLocation.lat = it.getV2XRecommendRouteEntity().getToPoint().get(1) + mNoveltyInfo = MarkerExploreWay() + mNoveltyInfo?.setLocation(markerLocation) + mTvAddress!!.text = "前往 ${it.getV2XRecommendRouteEntity().getFormatAddress()}" + AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice(it.getV2XRecommendRouteEntity().getTts(), VoicePreemptType.PREEMPT_TYPE_IMMEADIATELY, null) + } + + } + + override fun onCallback(command: String?, intent: Intent?) { + when (command) { + V2XVoiceConstants.V2X_CONFIRM_ACTION -> triggerStartNavi(mNoveltyInfo) + V2XVoiceConstants.V2X_CANCLE_ACTION -> delayedCloseWindow() + } + } + + + private fun registerUnwakeNavi() { + registerUnWakeVoice(V2XVoiceConstants.V2X_CONFIRM_ACTION, this) + registerUnWakeVoice(V2XVoiceConstants.V2X_CANCLE_ACTION, this) + } + + private fun unRegisterUnwakeNavi() { + unRegisterUnWakeVoice(V2XVoiceConstants.V2X_CONFIRM_ACTION) + unRegisterUnWakeVoice(V2XVoiceConstants.V2X_CANCLE_ACTION) + } +} \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt index 35024fa418..01b1cb6788 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/destination/V2XRecommendRouteScenario.kt @@ -1,20 +1,12 @@ package com.mogo.module.v2x.scenario.scene.destination -import android.view.View import android.view.ViewGroup -import com.mogo.commons.voice.AIAssist -import com.mogo.commons.voice.VoicePreemptType import com.mogo.module.common.entity.V2XMessageEntity import com.mogo.module.common.entity.V2XRecommendRouteEntity import com.mogo.module.v2x.R import com.mogo.module.v2x.V2XServiceManager import com.mogo.module.v2x.scenario.impl.AbsV2XScenario import com.mogo.module.v2x.utils.V2XUtils -import com.mogo.service.windowview.IMogoTopViewStatusListener -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch /** * created by wujifei on 2020/12/29 17:57 @@ -52,7 +44,7 @@ class V2XRecommendRouteScenario : AbsV2XScenario() { v2XWindow?.let { val layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V2XUtils.getApp().resources.getDimension(R.dimen.module_v2x_fatigue_driving_window_height_ground).toInt()) - V2XServiceManager.getMogoTopViewManager().addView(it.view, layoutParams, mogoTopViewStatusListener) + V2XServiceManager.getMogoTopViewManager().addView(it.view, layoutParams) it.show(v2XMessageEntity.content) } @@ -80,29 +72,5 @@ class V2XRecommendRouteScenario : AbsV2XScenario() { TODO("Not yet implemented") } - val mogoTopViewStatusListener: IMogoTopViewStatusListener = object : IMogoTopViewStatusListener { - private val mainScope = MainScope() - override fun onViewAdded(view: View?) { - AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice(v2XMessageEntity.content.getTts(),VoicePreemptType.PREEMPT_TYPE_IMMEADIATELY,null) - mainScope.launch { - delay(1000 * 20) - closeWindow() - } - } - - override fun onViewRemoved(view: View?) { - AIAssist.getInstance(V2XUtils.getApp()).breakOffSpeak() - mainScope.cancel() - } - - override fun beforeViewAddAnim(view: View?) { - - } - - override fun beforeViewRemoveAnim(view: View?) { - - } - } - } \ No newline at end of file From 606a8663c2a406edb3bea68c8b0958f26d4695f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Thu, 31 Dec 2020 17:48:46 +0800 Subject: [PATCH 48/51] =?UTF-8?q?=E9=99=8D=E4=BD=8E=E4=BA=86=E5=B0=8F?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E8=A7=86=E8=A7=92=E9=AB=98=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/module/small/map/SmallMapDirectionView.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDirectionView.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDirectionView.java index dec53d8d38..2d945b972f 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDirectionView.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDirectionView.java @@ -37,6 +37,7 @@ public class SmallMapDirectionView extends RelativeLayout { private AMapNaviView mAMapNaviView; private DirectionRotateAnimation mRotateAnimation; private int lastAngle = 0; + private int zoomLevel = 17; public SmallMapDirectionView(Context context) { this(context, null); @@ -133,19 +134,19 @@ public class SmallMapDirectionView extends RelativeLayout { options.setNaviArrowVisible(false); // 通过路线是否自动置灰,仅支持驾车导航 options.setAfterRouteAutoGray(false); - options.setZoom(((int) 9)); + //options.setZoom(((int) 9)); //options.setPointToCenter(0.7D, 0.5D); // 2D模式 options.setTilt(0); // 黑夜模式 -// options.setNaviNight(true); + //options.setNaviNight(true); // 自定义地图样式 options.setCustomMapStylePath(styleFilePath); mAMapNaviView.setViewOptions(options); } //设置希望展示的地图缩放级别 - CameraUpdate cameraUpdate = CameraUpdateFactory.zoomTo(12); + CameraUpdate cameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel); aMap.moveCamera(cameraUpdate); aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() { @@ -175,7 +176,7 @@ public class SmallMapDirectionView extends RelativeLayout { } //设置希望展示的地图缩放级别 - CameraUpdate cameraUpdate = CameraUpdateFactory.zoomTo(12); + CameraUpdate cameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel); aMap.moveCamera(cameraUpdate); } }); @@ -218,7 +219,7 @@ public class SmallMapDirectionView extends RelativeLayout { } //设置希望展示的地图缩放级别 - CameraUpdate cameraUpdate = CameraUpdateFactory.zoomTo(12); + CameraUpdate cameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel); aMap.moveCamera(cameraUpdate); } } From 50e87ec0431232d61646c2cd61ce6a08552b8ba8 Mon Sep 17 00:00:00 2001 From: wujifei Date: Thu, 31 Dec 2020 18:07:57 +0800 Subject: [PATCH 49/51] =?UTF-8?q?new#=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/V2XRecommendRouteEntity.java | 34 ------------------- .../common/entity/V2XRecommendRouteEntity.kt | 17 ++++++++++ .../v2x/adapter/holder/V2XRecommendRouteVH.kt | 8 ++--- .../module/v2x/network/V2XRefreshModel.java | 19 ++++++++--- .../scene/test/V2XTestConsoleWindow.java | 6 ++-- .../main/res/layout/window_test_console.xml | 2 +- 6 files changed, 39 insertions(+), 47 deletions(-) delete mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.kt diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java deleted file mode 100644 index b31673bcb2..0000000000 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.mogo.module.common.entity; - -import java.util.List; - -/** - * created by wujifei on 2020/12/24 15:33 - * describe:基于目的地预判的道路事件 - */ -public class V2XRecommendRouteEntity { - private List toPoint; //目的地坐标 - private String formatAddress; //目的地地址 - private String tts; //播报内容 - - public List getToPoint() { - return toPoint; - } - - public void setToPoint(List toPoint) { - this.toPoint = toPoint; - } - - public String getFormatAddress() { - return formatAddress; - } - - public void setFormatAddress(String formatAddress) { - this.formatAddress = formatAddress; - } - - public String getTts() { - tts = "主人,我发现前往" + formatAddress + "沿途有拥堵,推荐你导航最优路线,现在开启导航吗?"; - return tts; - } -} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.kt new file mode 100644 index 0000000000..10c8191fb7 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/V2XRecommendRouteEntity.kt @@ -0,0 +1,17 @@ +package com.mogo.module.common.entity + +/** + * created by wujifei on 2020/12/24 15:33 + * describe:基于目的地预判的道路事件 + */ +data class V2XRecommendRouteEntity( + var toPoint: List,//目的地坐标 + var formatAddress: String//目的地地址 +) { + var tts: String? = null //播报内容 + get() { + field = "主人,我发现前往" + formatAddress + "沿途有拥堵,推荐你导航最优路线,现在开启导航吗?" + return field + } + private set +} \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.kt b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.kt index 8cac03b737..924d0b0ea0 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.kt +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XRecommendRouteVH.kt @@ -62,12 +62,12 @@ class V2XRecommendRouteVH(viewGroup: ViewGroup, v2XWindow: IV2XWindow<*>) : V2XB override fun initView(viewData: V2XEventShowEntity?) { viewData?.let { val markerLocation = MarkerLocation() - markerLocation.lon = it.getV2XRecommendRouteEntity().getToPoint().get(0) - markerLocation.lat = it.getV2XRecommendRouteEntity().getToPoint().get(1) + markerLocation.lon = it.getV2XRecommendRouteEntity().toPoint.get(0) + markerLocation.lat = it.getV2XRecommendRouteEntity().toPoint.get(1) mNoveltyInfo = MarkerExploreWay() mNoveltyInfo?.setLocation(markerLocation) - mTvAddress!!.text = "前往 ${it.getV2XRecommendRouteEntity().getFormatAddress()}" - AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice(it.getV2XRecommendRouteEntity().getTts(), VoicePreemptType.PREEMPT_TYPE_IMMEADIATELY, null) + mTvAddress!!.text = "前往 ${it.getV2XRecommendRouteEntity().formatAddress}" + AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice(it.getV2XRecommendRouteEntity().tts, VoicePreemptType.PREEMPT_TYPE_IMMEADIATELY, null) } } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java index c782d288a3..ee2d1489e7 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/network/V2XRefreshModel.java @@ -19,6 +19,7 @@ import com.mogo.map.search.geo.MogoGeocodeResult; import com.mogo.map.search.geo.MogoRegeocodeResult; import com.mogo.module.common.entity.MarkerResponse; import com.mogo.module.common.entity.V2XMessageEntity; +import com.mogo.module.common.entity.V2XPoiTypeEnum; import com.mogo.module.common.entity.V2XRecommendRouteEntity; import com.mogo.module.service.ServiceConst; import com.mogo.module.service.network.RefreshBody; @@ -714,22 +715,30 @@ public class V2XRefreshModel { } private void sendBroadcast(V2XRoadDataRes v2XRoadDataRes) { + boolean isSendRecommendRoute = false; if (v2XRoadDataRes.getResult().getPoiData() != null && v2XRoadDataRes.getResult().getPoiData().size() > 0) { - V2XRecommendRouteEntity v2XRecommendRouteEntity = new V2XRecommendRouteEntity(); - v2XRecommendRouteEntity.setToPoint(v2XRoadDataRes.getResult().getTopPoint()); - v2XRecommendRouteEntity.setFormatAddress(v2XRoadDataRes.getResult().getFormatAddress()); + for (V2XRoadDataRes.ResultDTO.PoiDataDTO poiDataDTO : v2XRoadDataRes.getResult().getPoiData()) { + if (!V2XPoiTypeEnum.FOURS_LIVING.equals(poiDataDTO.getPoiType())) { + isSendRecommendRoute = true; + break; + } + } + } + if (isSendRecommendRoute) { V2XMessageEntity v2xMessageEntity = new V2XMessageEntity<>(); // 控制类型 v2xMessageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_RECOMMEND_ROUTE); // 设置数据 - v2xMessageEntity.setContent(v2XRecommendRouteEntity); + v2xMessageEntity.setContent(new V2XRecommendRouteEntity(v2XRoadDataRes.getResult().getTopPoint(), v2XRoadDataRes.getResult().getFormatAddress())); // 控制展示状态 v2xMessageEntity.setShowState(true); Intent intent = new Intent(V2XConst.BROADCAST_SCENE_HANDLER_ACTION); intent.putExtra(V2XConst.BROADCAST_SCENE_EXTRA_KEY, v2xMessageEntity); LocalBroadcastManager.getInstance(V2XUtils.getApp()).sendBroadcast(intent); - } else if (v2XRoadDataRes.getResult().getIllegalParkingData() != null && v2XRoadDataRes.getResult().getIllegalParkingData().size() > 0) { + } + + if (!isSendRecommendRoute && v2XRoadDataRes.getResult().getIllegalParkingData() != null && v2XRoadDataRes.getResult().getIllegalParkingData().size() > 0) { // TODO: 2020/12/30 } } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/test/V2XTestConsoleWindow.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/test/V2XTestConsoleWindow.java index f474f567a5..61e5a72ac6 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/test/V2XTestConsoleWindow.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/test/V2XTestConsoleWindow.java @@ -57,7 +57,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout { private Button mBtnTriggerCallUserInfo; private Button mBtnTriggerEventUgc; private Button mBtnTriggerTrafficSearch; - private Button mBtnTriggerPrejectedRoadEvent; + private Button mBtnTriggerRecommendRouteEvent; private Button nBtnTriggerVR; private Button btnTriggerRearVIPCarTip, @@ -118,7 +118,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout { mBtnTriggerEventUgc = findViewById(R.id.btnTriggerEventUgc); mBtnTriggerCallUserInfo = findViewById(R.id.btnTriggerCallUserInfo); mBtnTriggerTrafficSearch = findViewById(R.id.btnTriggerTrafficSearch); - mBtnTriggerPrejectedRoadEvent = findViewById(R.id.btnTriggerPrejectedRoadEvent); + mBtnTriggerRecommendRouteEvent = findViewById(R.id.btnTriggerRecommendRouteEvent); nBtnTriggerVR = findViewById(R.id.btnTriggerVR); switch (showType) { @@ -279,7 +279,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout { mBtnTriggerTrafficSearch.setOnClickListener(v -> V2XServiceManager.getIMogoTrafficUploadProvider().verifyCurrentTrafficStatus()); - mBtnTriggerPrejectedRoadEvent.setOnClickListener(view -> { + mBtnTriggerRecommendRouteEvent.setOnClickListener(view -> { V2XServiceManager.getV2XRefreshModel().queryRoadData("ZD802C1938L10797"); }); diff --git a/modules/mogo-module-v2x/src/main/res/layout/window_test_console.xml b/modules/mogo-module-v2x/src/main/res/layout/window_test_console.xml index 6936631ec6..71209e7cca 100644 --- a/modules/mogo-module-v2x/src/main/res/layout/window_test_console.xml +++ b/modules/mogo-module-v2x/src/main/res/layout/window_test_console.xml @@ -211,7 +211,7 @@ app:layout_constraintStart_toStartOf="parent" />