From 502e076d168d759a2fcbf10377e19c5de440e142 Mon Sep 17 00:00:00 2001 From: mengyanshou Date: Thu, 5 May 2022 14:41:02 +0800 Subject: [PATCH 01/38] =?UTF-8?q?docs(Flutter)=20:=20=E6=95=B4=E4=BD=93?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BC=98=E5=8C=96=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=EF=BC=8C=E4=BB=A3=E7=A0=81=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Flutter/README.md | 91 +++++++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 35 deletions(-) diff --git a/Flutter/README.md b/Flutter/README.md index 0222ee0a2..147de9be5 100644 --- a/Flutter/README.md +++ b/Flutter/README.md @@ -1,62 +1,83 @@ +**目录** +- [DoKit Flutter版](#doKit-flutter版) +- [支持 Flutter 版本](#支持flutter版本) +- [Pub地址](#pub地址) +- [接入](#接入) +- [功能简介](#功能简介) + - [全部组件](#全部组件) + - [日志查看](#日志查看) + - [网络请求](#网络请求) + - [Method Channel信息](#method-channel信息) + - [路由信息](#路由信息) + - [帧率](#帧率) + - [内存](#内存) + - [基本信息](#基本信息) + - [控件检查](#控件检查) + - [颜色拾取](#颜色拾取) + - [Widget层级](#widget层级) + - [页面源码查看](#页面源码查看) + - [页面启动耗时](#页面启动耗时) + - [自定义入口](#自定义入口) + # DoKit Flutter版 -内测版本,目前提供了日志、method channel信息、路由信息、网络抓包、帧率、设备与内存信息查看、控件信息查看、颜色拾取、启动耗时、查看源码、查看widget的build链以及对齐标尺的功能. +内测版本,目前提供了日志、method channel 信息、路由信息、网络抓包、帧率、设备与内存信息查看、控件信息查看、颜色拾取、启动耗时、查看源码、查看 widget 的 build 链以及对齐标尺的功能. + +## 支持Flutter版本 -## 支持flutter版本 -version>=1.17.5,其余版本未做过兼容性测试。支持flutter2.0的分支为`0.8.0-nullsafety.0`,后期维护主要会基于该版本进行。 +version>=1.17.5,其余版本未做过兼容性测试。支持 flutter2.0 的分支为`0.8.0-nullsafety.0`,后期维护主要会基于该版本进行。 ## Pub地址 + [DoKit For Flutter](https://pub.dev/packages/dokit) ## 接入 -在pubspect.yaml文件的dependencies节点添加pub依赖 +1.在pubspect.yaml文件的dependencies节点添加pub依赖 -``` +```yaml dependencies: dokit: ^0.8.0-nullsafety.0 ``` -在main函数入口初始化。 DoKit使用runZone的方式进行日志捕获,方法通道的捕获,如果你的app需要使用同样的方式会有冲突。 +2.在 main 函数入口初始化。 DoKit 使用 runZone 的方式进行日志捕获,方法通道的捕获,如果你的 app 需要使用同样的方式会有冲突。 -``` +```dart void main() => { - - DoKit.runApp(app:DoKitApp(MyApp()), - // 是否在release包内使用,默认release包会禁用 - useInRelease: true, - // 选择性控制是否使用dokit中的runZonedGuarded,false: 禁用;true: 启用 - useRunZoned: false, - releaseAction: () => { - // release模式下执行该函数,一些用到runZone之类实现的可以放到这里,该值为空则会直接调用系统的runApp(MyApp()), - }) - }; + DoKit.runApp( + app: DoKitApp(const MyApp()), + // 是否在release包内使用,默认release包会禁用 + useInRelease: true, + // 选择性控制是否使用dokit中的runZonedGuarded,false: 禁用;true: 启用 + useRunZoned: false, + releaseAction: () => { + // release模式下执行该函数,一些用到runZone之类实现的可以放到这里,该值为空则会直接调用系统的runApp(MyApp()), + }, + ); } ``` -**注:谷歌提供的DevTool会折叠非主工程内实例化的widget(根据source file是否属于当前工程),DoKit需要实例化一个wrapper widget用以展示各种overlay, - 如果在package内去声明这个wrapper,会导致左边树全部被折叠。故这里要求在main文件内使用DoKitApp(MyApp())的方式来初始化入口** - +**注:谷歌提供的 DevTool 会折叠非主工程内实例化的widget(根据source file 是否属于当前工程),DoKit 需要实例化一个 wrapper widget 用以展示各种 overlay, +如果在 package 内去声明这个 wrapper,会导致左边树全部被折叠。故这里要求在main文件内使用 DoKitApp(MyApp())的方式来初始化入口** +另外提供了一个异步创建入口 Widget的方式,需要异步构建widget的情况。(有些库会在异步构建 Widget 的时候调用 WidgetFlutterBinding.ensureInitialized(),影响 DoKit的 method channel 监控和日志监控,需要延迟到 runZone 内执行) +s +```dart +void main() { + DoKit.runApp( + appCreator: () async => DoKitApp( + await crateApp(), + ), + ); +} - 另外提供了一个异步创建入口Widget的方式,需要异步构建widget的情况。(有些库会在异步构建Widget的时候调用WidgetFlutterBinding.ensureInitialized(),影响DoKit的method channel监控 - 和日志监控,需要延迟到runZone内执行) -``` -void main() => { - DoKit.runApp( - appCreator: () async => - DoKitApp(await crateApp()))); - }; - - Widget crateApp() async{ - // 一些初始化操作 - await ... - return MyApp(); - } +Future crateApp() async { + // 一些初始化操作 + return MyApp(); } ``` -### 参数说明 +**参数说明** 参数 | 返回类型 | 说明 | 是否必须 From 84da2ea0f470de0bb277dd21364e10ebe03f6d1c Mon Sep 17 00:00:00 2001 From: mengyanshou Date: Thu, 5 May 2022 14:48:12 +0800 Subject: [PATCH 02/38] =?UTF-8?q?docs(Flutter):=20=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Flutter/README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Flutter/README.md b/Flutter/README.md index 147de9be5..27369a87a 100644 --- a/Flutter/README.md +++ b/Flutter/README.md @@ -1,5 +1,5 @@ **目录** -- [DoKit Flutter版](#doKit-flutter版) +- [DoKit Flutter版](#dokit-flutter版) - [支持 Flutter 版本](#支持flutter版本) - [Pub地址](#pub地址) - [接入](#接入) @@ -32,7 +32,7 @@ version>=1.17.5,其余版本未做过兼容性测试。支持 flutter2.0 的 [DoKit For Flutter](https://pub.dev/packages/dokit) ## 接入 -1.在pubspect.yaml文件的dependencies节点添加pub依赖 +1.在 `pubspect.yaml` 文件的 dependencies 节点添加 pub 依赖 ```yaml dependencies: @@ -57,10 +57,10 @@ void main() => { ``` -**注:谷歌提供的 DevTool 会折叠非主工程内实例化的widget(根据source file 是否属于当前工程),DoKit 需要实例化一个 wrapper widget 用以展示各种 overlay, -如果在 package 内去声明这个 wrapper,会导致左边树全部被折叠。故这里要求在main文件内使用 DoKitApp(MyApp())的方式来初始化入口** +**注:谷歌提供的 DevTool 会折叠非主工程内实例化的 widget(根据 source file 是否属于当前工程),DoKit 需要实例化一个 wrapper widget 用以展示各种 overlay, +如果在 package 内去声明这个 wrapper,会导致左边树全部被折叠。故这里要求在 main 文件内使用 `DoKitApp(MyApp())` 的方式来初始化入口** 另外提供了一个异步创建入口 Widget的方式,需要异步构建widget的情况。(有些库会在异步构建 Widget 的时候调用 WidgetFlutterBinding.ensureInitialized(),影响 DoKit的 method channel 监控和日志监控,需要延迟到 runZone 内执行) -s + ```dart void main() { DoKit.runApp( @@ -97,7 +97,7 @@ releaseAction | Function | release模式下执行该函数,该值为空则会 -当前版本DoKit支持的所有功能全览。常驻工具为显示在底部tab栏的组件,可通过拖动将组件放置或移出常驻工具。 +当前版本 DoKit 支持的所有功能全览。常驻工具为显示在底部 tab 栏的组件,可通过拖动将组件放置或移出常驻工具。 ### 日志查看 @@ -105,7 +105,7 @@ releaseAction | Function | release模式下执行该函数,该值为空则会 -查看使用print方式打印出来的日志,捕获的异常会以红色显示。超过7行的日志会自动折叠,点击可展开。长按复制日志到剪贴板。 +查看使用 print 方式打印出来的日志,捕获的异常会以红色显示。超过7行的日志会自动折叠,点击可展开。长按复制日志到剪贴板。 ### 网络请求 @@ -113,7 +113,7 @@ releaseAction | Function | release模式下执行该函数,该值为空则会 -可以捕获通过flutter httpclient发出的网络请求,主流的http、dio库底层也是通过httpclient实现的,也能捕获。 +可以捕获通过 flutter httpclient 发出的网络请求,主流的 http、dio 库底层也是通过 httpclient 实现的,也能捕获。 ### Method Channel信息 @@ -121,14 +121,14 @@ releaseAction | Function | release模式下执行该函数,该值为空则会 -可以展示从dart端到native和从native端到dart端的方法调用、参数、返回结果。 +可以展示从 dart 端到 native 和从 native 端到 dart 端的方法调用、参数、返回结果。 ### 路由信息 -展示当前页面的路由信息,当存在多层Navigator组件嵌套时,会展示多层的路由信息。 +展示当前页面的路由信息,当存在多层 Navigator 组件嵌套时,会展示多层的路由信息。 **注:当前查找栈顶widget是通过遍历整棵widget tree的方式,如果添加了overlay,栈顶widget会始终指向overlay,导致该功能读取数据异常。** @@ -138,7 +138,7 @@ releaseAction | Function | release模式下执行该函数,该值为空则会 -展示最近240帧的耗时情况,每次进入该页面刷新。debug模式下帧率会普遍偏高,profile和release模式下会比较正常。 +展示最近240帧的耗时情况,每次进入该页面刷新。debug 模式下帧率会普遍偏高,profile 和 release 模式下会比较正常。 ### 内存 @@ -154,7 +154,7 @@ releaseAction | Function | release模式下执行该函数,该值为空则会 -展示当前dart虚拟机进程、cpu、版本信息;当前app包名和dart工程构建版本信息; +展示当前 dart 虚拟机进程、cpu、版本信息;当前 app 包名和 dart 工程构建版本信息; **注:该功能通过VMService获取数据,release模式下无法使用。flutter版本号需要flutter attach后才可获取** @@ -168,13 +168,13 @@ releaseAction | Function | release模式下执行该函数,该值为空则会 ### 颜色拾取 -查看当前页面任何位置对应的像素点的RGBA颜色值,方便UI的调试和获取像素点的颜色 +查看当前页面任何位置对应的像素点的 RGBA 颜色值,方便UI的调试和获取像素点的颜色 ### Widget层级 -查看当前选中widget的树层级,以及它renderObject的详细build链等信息 +查看当前选中 widget 的树层级,以及它 renderObject 的详细 build 链等信息 ### 页面源码查看 @@ -188,7 +188,7 @@ releaseAction | Function | release模式下执行该函数,该值为空则会 获取页面的启动耗时, -框架已做无侵入的注入NavigatorObserver。但是在较复杂的App构建时可能失效,需要手动添加`DokitNavigatorObserver` +框架已做无侵入的注入 NavigatorObserver。但是在较复杂的 App 构建时可能失效,需要手动添加`DokitNavigatorObserver` **注:页面启动耗时信息只有在profile或release模式下才有意义** From a1c8242c64fc1187b809fd9fe14b73a123fbba9a Mon Sep 17 00:00:00 2001 From: realonezhang Date: Thu, 4 Aug 2022 15:33:19 +0800 Subject: [PATCH 03/38] =?UTF-8?q?feat:=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Android/.gitignore | 3 +- Android/build.gradle | 3 +- .../processor/DoKitPluginConfigProcessor.kt | 7 +++- Android/config.gradle | 7 ++-- .../classtransformer/CommClassTransformer.kt | 8 ++-- .../processor/DoKitPluginConfigProcessor.kt | 7 +++- .../mock/http/DoKitProxyMockInterceptor.kt | 2 - Android/dokit/build.gradle | 4 +- .../doraemonkit/datapick/DataPickBean.java | 14 +++++-- .../doraemonkit/datapick/DataPickManager.java | 9 +++- .../doraemonkit/datapick/DataPickUtils.java | 42 +++++++++++++++++++ .../kit/core/NormalDoKitViewManager.kt | 1 + .../layoutborder/LayoutLevelDoKitView.java | 3 +- .../doraemonkit/kit/main/MainIconDoKitView.kt | 7 +++- .../kit/toolpanel/ToolPanelDoKitView.kt | 5 ++- Android/upload_local.sh | 2 +- 16 files changed, 96 insertions(+), 28 deletions(-) create mode 100644 Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickUtils.java diff --git a/Android/.gitignore b/Android/.gitignore index 6b49b8933..551477dc5 100644 --- a/Android/.gitignore +++ b/Android/.gitignore @@ -6,6 +6,7 @@ local.properties /.idea/workspace.xml .DS_Store /build +/*/build /captures .externalNativeBuild .idea/ @@ -13,4 +14,4 @@ local.properties .classpath .settings/ /*/*.iml -/*/*/*.iml \ No newline at end of file +/*/*/*.iml diff --git a/Android/build.gradle b/Android/build.gradle index 57b521466..90e998c44 100644 --- a/Android/build.gradle +++ b/Android/build.gradle @@ -41,15 +41,16 @@ buildscript { } dependencies { classpath "com.android.tools.build:gradle:$gradlePluginVersion" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" // MavenCentral classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.4.30" if (runType == 1) { classpath "io.github.didi.dokit:dokitx-plugin:$dokitPluginVersion" } + // classpath "com.didiglobal.booster:booster-task-compression-pngquant:${rootProject.ext.android["booster_version"]}" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" // classpath "com.didiglobal.booster:booster-gradle-plugin:3.3.1" // classpath "com.didiglobal.booster:booster-task-analyser:3.3.1" } diff --git a/Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt b/Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt index 370fa8994..1525e60d9 100644 --- a/Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt +++ b/Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt @@ -146,7 +146,12 @@ class DoKitPluginConfigProcessor(val project: Project) : VariantProcessor { val parser = SAXParserFactory.newInstance().newSAXParser() val handler = DoKitComponentHandler() "App Manifest path====>$manifest".println() - parser.parse(manifest, handler) + try { + parser.parse(manifest, handler) + } catch (e: Exception) { + e.printStackTrace() + "===processDebugManifest task error. ${manifest.absoluteFile}".println() + } "App PackageName is====>${handler.appPackageName}".println() "App Application path====>${handler.applications}".println() DoKitExtUtil.setAppPackageName(handler.appPackageName) diff --git a/Android/config.gradle b/Android/config.gradle index a94832433..64de66c93 100755 --- a/Android/config.gradle +++ b/Android/config.gradle @@ -3,7 +3,7 @@ ext { //0:发布到到本地localRepoURL仓库 //1:发布到滴滴内部仓库 一般不建议使用 如果需要发布到滴滴内网仓库需要将版本号改得比较大 假如版本号跟jcenter上的一致会由于缓存导致没法下载最新的jcenter的线上代码 //2:发布到maven_central远程仓库 - archives_type: 0, + archives_type: 1, //0:依赖dokit本地module运行 //1:依赖dokit远程aar运行 run_type : 0, @@ -12,8 +12,9 @@ ext { run_env : 1, //是否使用本地仓库,需要使用绝对路径,仓库地址在 local.properties 中添加 LOCAL_REPOSITORY_URL use_local : true, - group_id : 'io.github.didi.dokit', - version : '3.7.3' +// group_id : 'io.github.didi.dokit', + group_id : 'com.didichuxing.doraemonkit', + version : '3.7.0.5' ] android = [compileSdkVersion : 29, diff --git a/Android/dokit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommClassTransformer.kt b/Android/dokit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommClassTransformer.kt index 324f0f289..75dcfbecb 100644 --- a/Android/dokit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommClassTransformer.kt +++ b/Android/dokit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommClassTransformer.kt @@ -169,11 +169,9 @@ class CommClassTransformer : AbsClassTransformer() { it.name == "removeUpdates" }.let { methodNode -> "${context.projectDir.lastPath()}->hook tencent map succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println() -// methodNode?.instructions?.getMethodExitInsnNodes()?.forEach { - methodNode?.instructions?.insert( - createTencentLocationUnRegisterInsnList() - ) -// } + methodNode?.instructions?.insert( + createTencentLocationUnRegisterInsnList() + ) } } diff --git a/Android/dokit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt b/Android/dokit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt index 370fa8994..1525e60d9 100644 --- a/Android/dokit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt +++ b/Android/dokit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt @@ -146,7 +146,12 @@ class DoKitPluginConfigProcessor(val project: Project) : VariantProcessor { val parser = SAXParserFactory.newInstance().newSAXParser() val handler = DoKitComponentHandler() "App Manifest path====>$manifest".println() - parser.parse(manifest, handler) + try { + parser.parse(manifest, handler) + } catch (e: Exception) { + e.printStackTrace() + "===processDebugManifest task error. ${manifest.absoluteFile}".println() + } "App PackageName is====>${handler.appPackageName}".println() "App Application path====>${handler.applications}".println() DoKitExtUtil.setAppPackageName(handler.appPackageName) diff --git a/Android/dokit-test/src/main/java/com/didichuxing/doraemonkit/kit/test/mock/http/DoKitProxyMockInterceptor.kt b/Android/dokit-test/src/main/java/com/didichuxing/doraemonkit/kit/test/mock/http/DoKitProxyMockInterceptor.kt index 01ecfc869..359d9d353 100644 --- a/Android/dokit-test/src/main/java/com/didichuxing/doraemonkit/kit/test/mock/http/DoKitProxyMockInterceptor.kt +++ b/Android/dokit-test/src/main/java/com/didichuxing/doraemonkit/kit/test/mock/http/DoKitProxyMockInterceptor.kt @@ -5,12 +5,10 @@ import com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.AbsDoKitInterc import com.didichuxing.doraemonkit.kit.test.mock.MockManager import com.didichuxing.doraemonkit.kit.test.utils.RandomIdentityUtil import com.didichuxing.doraemonkit.util.LogHelper -import io.ktor.http.* import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.runBlocking import okhttp3.* import java.io.IOException -import java.util.* import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine diff --git a/Android/dokit/build.gradle b/Android/dokit/build.gradle index 97744c054..d7855d529 100644 --- a/Android/dokit/build.gradle +++ b/Android/dokit/build.gradle @@ -173,9 +173,7 @@ configurations.all { // } } } -repositories { - mavenCentral() -} + diff --git a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickBean.java b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickBean.java index 9db37c440..3d011ef84 100644 --- a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickBean.java +++ b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickBean.java @@ -73,9 +73,14 @@ public static class EventBean { * 埋点记录时间 */ private String time; + /** + * 页面ID + */ + private String pageId; - EventBean(String eventName) { + EventBean(String eventName, String pageId) { this.eventName = eventName; + this.pageId = pageId; this.time = "" + TimeUtils.getNowMills(); } @@ -88,9 +93,10 @@ String getTime() { @Override public String toString() { return "EventBean{" + - ", eventName='" + eventName + '\'' + - ", time=" + time + - '}'; + "eventName='" + eventName + '\'' + + ", time='" + time + '\'' + + ", pageId='" + pageId + '\'' + + '}'; } } diff --git a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickManager.java b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickManager.java index 68fdc9fc7..772cc72c0 100644 --- a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickManager.java +++ b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickManager.java @@ -49,14 +49,19 @@ public static DataPickManager getInstance() { return DataPickManager.Holder.INSTANCE; } + + public void addData(@NonNull String eventName) { + addData(eventName, ""); + } + /** * 添加埋点数据 * * @param eventName */ - public void addData(@NonNull String eventName) { + public void addData(@NonNull String eventName, @NonNull String pageId) { - DataPickBean.EventBean eventBean = new DataPickBean.EventBean(eventName); + DataPickBean.EventBean eventBean = new DataPickBean.EventBean(eventName, pageId); if (events != null) { events.add(eventBean); //链表数据大于10s 上传数据 diff --git a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickUtils.java b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickUtils.java new file mode 100644 index 000000000..b27fa6852 --- /dev/null +++ b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/datapick/DataPickUtils.java @@ -0,0 +1,42 @@ +package com.didichuxing.doraemonkit.datapick; + +import android.app.Activity; + +import com.didichuxing.doraemonkit.util.ActivityUtils; + +/** + * didi Create on 2022年7月14日 . + *

+ * Copyright (c) 2022年7月14日 by didiglobal.com. + * + * @author zhangjun + * @version 1.0 + * @Date 2022年7月14日 2:57 下午 + * @Description 用一句话说明文件功能 + */ + +public class DataPickUtils { + + + private static String mDoKitHomeClickPage = ""; + + private DataPickUtils() { + } + + public static String getCurrentPage() { + Activity activity = ActivityUtils.getTopActivity(); + if (activity != null) { + return activity.getClass().getName(); + } + return ""; + } + + + public static void setDoKitHomeClickPage(String pageId) { + mDoKitHomeClickPage = pageId; + } + + public static String getDoKitHomeClickPage() { + return mDoKitHomeClickPage; + } +} diff --git a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/core/NormalDoKitViewManager.kt b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/core/NormalDoKitViewManager.kt index 00a026eb2..6c388b305 100644 --- a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/core/NormalDoKitViewManager.kt +++ b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/core/NormalDoKitViewManager.kt @@ -32,6 +32,7 @@ internal class NormalDoKitViewManager : AbsDoKitViewManager() { private val context: Context get() = DoKitEnv.requireApp() /** + * * 每个Activity中dokitView的集合 用户手动移除和页面销毁时都需要remove * */ diff --git a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/layoutborder/LayoutLevelDoKitView.java b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/layoutborder/LayoutLevelDoKitView.java index e35e7b88f..e2d15a1e9 100644 --- a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/layoutborder/LayoutLevelDoKitView.java +++ b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/layoutborder/LayoutLevelDoKitView.java @@ -14,6 +14,7 @@ import androidx.fragment.app.Fragment; import com.didichuxing.doraemonkit.DoKit; +import com.didichuxing.doraemonkit.datapick.DataPickUtils; import com.didichuxing.doraemonkit.util.ActivityUtils; import com.didichuxing.doraemonkit.util.ToastUtils; import com.didichuxing.doraemonkit.R; @@ -118,7 +119,7 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mScalpelFrameLayout.setLayerInteractionEnabled(true); } //发送埋点 - DataPickManager.getInstance().addData("dokit_sdk_ui_ck_widget_3d"); + DataPickManager.getInstance().addData("dokit_sdk_ui_ck_widget_3d", DataPickUtils.getCurrentPage()); } else { if (mScalpelFrameLayout != null) { mScalpelFrameLayout.setLayerInteractionEnabled(false); diff --git a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/main/MainIconDoKitView.kt b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/main/MainIconDoKitView.kt index 81ee02cd3..1ef4c9300 100644 --- a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/main/MainIconDoKitView.kt +++ b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/main/MainIconDoKitView.kt @@ -8,6 +8,7 @@ import com.didichuxing.doraemonkit.DoKit import com.didichuxing.doraemonkit.R import com.didichuxing.doraemonkit.config.FloatIconConfig import com.didichuxing.doraemonkit.datapick.DataPickManager +import com.didichuxing.doraemonkit.datapick.DataPickUtils import com.didichuxing.doraemonkit.kit.core.AbsDoKitView import com.didichuxing.doraemonkit.kit.core.DoKitViewLayoutParams @@ -28,9 +29,13 @@ class MainIconDoKitView : AbsDoKitView() { doKitView?.id = R.id.float_icon_id //设置icon 点击事件 doKitView?.setOnClickListener { //统计入口 - DataPickManager.getInstance().addData("dokit_sdk_home_ck_entry") + val pageId = DataPickUtils.getCurrentPage() + DataPickUtils.setDoKitHomeClickPage(pageId) + DataPickManager.getInstance().addData("dokit_sdk_home_ck_entry", pageId) DoKit.showToolPanel() } + + DataPickManager.getInstance().addData("dokit_sdk_home_show", DataPickUtils.getCurrentPage()) } override fun onCreateView(context: Context, view: FrameLayout): View { diff --git a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/toolpanel/ToolPanelDoKitView.kt b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/toolpanel/ToolPanelDoKitView.kt index 9f6ba2251..a1b095740 100644 --- a/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/toolpanel/ToolPanelDoKitView.kt +++ b/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/toolpanel/ToolPanelDoKitView.kt @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView import com.didichuxing.doraemonkit.DoKit import com.didichuxing.doraemonkit.R import com.didichuxing.doraemonkit.datapick.DataPickManager +import com.didichuxing.doraemonkit.datapick.DataPickUtils import com.didichuxing.doraemonkit.kit.core.AbsDoKitView import com.didichuxing.doraemonkit.kit.core.DoKitManager import com.didichuxing.doraemonkit.kit.core.DoKitViewLayoutParams @@ -129,9 +130,9 @@ class ToolPanelDoKitView : AbsDoKitView() { //添加埋点 if (it.isInnerKit && !TextUtils.isEmpty(it.innerKitId())) { - DataPickManager.getInstance().addData(it.innerKitId()) + DataPickManager.getInstance().addData(it.innerKitId(), DataPickUtils.getDoKitHomeClickPage()) } else { - DataPickManager.getInstance().addData("dokit_sdk_business_ck") + DataPickManager.getInstance().addData("dokit_sdk_business_ck",DataPickUtils.getDoKitHomeClickPage()) } } diff --git a/Android/upload_local.sh b/Android/upload_local.sh index 951cf8def..6db450920 100755 --- a/Android/upload_local.sh +++ b/Android/upload_local.sh @@ -27,12 +27,12 @@ RES="033円[0m" ./gradlew :dokit-pthread-hook:assembleRelease --stacktrace ./gradlew :dokit-gps-mock:assembleRelease --stacktrace #publish +./gradlew :dokit-plugin:publish --stacktrace ./gradlew :dokit:publish --stacktrace ./gradlew :dokit-no-op:publish --stacktrace ./gradlew :dokit-okhttp-api:publish --stacktrace ./gradlew :dokit-okhttp-v3:publish --stacktrace ./gradlew :dokit-okhttp-v4:publish --stacktrace -./gradlew :dokit-plugin:publish --stacktrace ./gradlew :dokit-ft:publish --stacktrace ./gradlew :dokit-test:publish --stacktrace ./gradlew :dokit-autotest:publish --stacktrace From 707523f97cdfeef3dd241d9cbfd3727023d96e0b Mon Sep 17 00:00:00 2001 From: henryhe Date: Wed, 7 Sep 2022 17:37:12 +0800 Subject: [PATCH 04/38] =?UTF-8?q?feat(Android):=E5=A2=9E=E5=8A=A0=E5=BF=83?= =?UTF-8?q?=E8=B7=B3=E4=B8=A2=E5=A4=B1=E6=A8=A1=E6=8B=9F=E5=8A=9F=E8=83=BD?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Android/config.gradle | 4 +- .../gps_mock/common/BdMapRouteData.java | 18 ++++ .../gps_mock/gpsmock/GpsMockFragment.java | 38 ++++++-- .../gps_mock/gpsmock/GpsMockManager.java | 90 ++++++++++++++++--- .../gps_mock/widget/DrivingRouteOverlay.java | 1 - .../gps_mock/widget/OverlayManager.java | 80 +++++++++++++---- .../main/res/layout/dk_fragment_gps_mock.xml | 64 +++++++++++-- .../src/main/res/values-en-rCN/strings.xml | 2 + .../src/main/res/values-zh-rTW/strings.xml | 2 + .../src/main/res/values-zh-rUS/strings.xml | 2 + .../src/main/res/values/strings.xml | 2 + .../classtransformer/CommClassTransformer.kt | 8 +- .../doraemonkit/config/GpsMockConfig.java | 25 ++++++ .../doraemonkit/constant/SharedPrefsKey.java | 3 + 14 files changed, 292 insertions(+), 47 deletions(-) diff --git a/Android/config.gradle b/Android/config.gradle index a94832433..2da7c5694 100755 --- a/Android/config.gradle +++ b/Android/config.gradle @@ -3,7 +3,7 @@ ext { //0:发布到到本地localRepoURL仓库 //1:发布到滴滴内部仓库 一般不建议使用 如果需要发布到滴滴内网仓库需要将版本号改得比较大 假如版本号跟jcenter上的一致会由于缓存导致没法下载最新的jcenter的线上代码 //2:发布到maven_central远程仓库 - archives_type: 0, + archives_type: 1, //0:依赖dokit本地module运行 //1:依赖dokit远程aar运行 run_type : 0, @@ -13,7 +13,7 @@ ext { //是否使用本地仓库,需要使用绝对路径,仓库地址在 local.properties 中添加 LOCAL_REPOSITORY_URL use_local : true, group_id : 'io.github.didi.dokit', - version : '3.7.3' + version : '3.6.1.700' ] android = [compileSdkVersion : 29, diff --git a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/common/BdMapRouteData.java b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/common/BdMapRouteData.java index 715f82987..efd7b105b 100644 --- a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/common/BdMapRouteData.java +++ b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/common/BdMapRouteData.java @@ -18,10 +18,18 @@ public class BdMapRouteData { List mRandomDriftPoints = new ArrayList(); List mRouteDriftPoints = new ArrayList(); + List mRouteLostLocPoints = new ArrayList(); private int mRandomDriftDistance; private int mRouteDriftDistance; + public com.baidu.mapapi.model.LatLng mOriginRouteStartLostPoint; + public com.baidu.mapapi.model.LatLng mOriginRouteEndLostPoint; + public com.baidu.mapapi.model.LatLng mRandomDriftStartLostPoint; + public com.baidu.mapapi.model.LatLng mRandomDriftEndLostPoint; + public com.baidu.mapapi.model.LatLng mRouteDriftStartLostPoint; + public com.baidu.mapapi.model.LatLng mRouteDriftEndLostPoint; + public List getAllPoints() { return mAllPoints; } @@ -73,6 +81,16 @@ public void setRouteDriftPoints(List routeDriftPoints) { mRouteDriftPoints.addAll(routeDriftPoints); } + + public List getOriginRouteLostLocPoints() { + return mRouteLostLocPoints; + } + + public void setOriginRouteLostLocPoints(List routeLostLocPoints) { + mRouteLostLocPoints.clear(); + mRouteLostLocPoints.addAll(routeLostLocPoints); + } + public boolean isRouteDataFromBiz() { return mRouteDataFromBiz; } diff --git a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockFragment.java b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockFragment.java index fafd572af..bacefada7 100644 --- a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockFragment.java +++ b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockFragment.java @@ -115,6 +115,8 @@ public class GpsMockFragment extends BaseFragment implements View.OnClickListene private SeekRangeBar mSeekBar; private Group mGroupSelectPath; private Group mGroupSelectAutoPath; + private CheckBox mCbDriftLostLoc; + private SeekRangeBar mDriftLostLocSeekBar; private Button mBtnMockRoute2; private ImageView mIvDownExpand; private TextView mTvOriginDistance; @@ -205,6 +207,8 @@ private void initView() { mSeekBar = findViewById(R.id.seekbar_select_path); mGroupSelectPath = findViewById(R.id.group_select_path); mGroupSelectAutoPath = findViewById(R.id.group_select_auto_path); + mCbDriftLostLoc = findViewById(R.id.cb_toggle_route_lost_loc); + mDriftLostLocSeekBar = findViewById(R.id.seekbar_select_lost_path); mBtnMockRoute2 = findViewById(R.id.btn_mock_route2); mTvOriginDistance = findViewById(R.id.tv_real_distance); mTvMockDistance = findViewById(R.id.tv_mock_distance); @@ -228,6 +232,11 @@ private void initView() { mCbToggleRouteDriftMock.setOnCheckedChangeListener(this); mCbToggleRouteDriftMock.setChecked(GpsMockConfig.isRouteDriftMockOpen()); + mCbDriftLostLoc.setOnCheckedChangeListener(this); + mCbDriftLostLoc.setChecked(GpsMockConfig.isRouteDriftMockLostLocOpen()); + mDriftLostLocSeekBar.setProgressLow(GpsMockConfig.getLostLocSeekBarLow()); + mDriftLostLocSeekBar.setProgressHigh(GpsMockConfig.getLostLocSeekBarHigh()); + // 临时先屏蔽 // mCbToggleRouteDriftMock.setEnabled(false); // mDriftSettingLayout.setVisibility(View.GONE); @@ -397,7 +406,7 @@ private void drawRoute() { if (GpsMockManager.getInstance().getBdMockDrivingRouteLine() != null) { mBdMapView.setOnMarkerClickListener(mDrivingRouteOverlay); mDrivingRouteOverlay.setBdMapRouteData(GpsMockManager.getInstance().getBdMockDrivingRouteLine()); - mDrivingRouteOverlay.addToMap(); + mDrivingRouteOverlay.addToMap(mCbDriftLostLoc.isChecked()); mDrivingRouteOverlay.zoomToSpan(); mTvOriginDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getTotalDistance())); @@ -406,10 +415,10 @@ private void drawRoute() { if (checkDriftToggle()) { if (GpsMockManager.getInstance().getBdMockDrivingRouteLine() != null) { if (mCurDriftTypeIndex == DriftType.DRIFT_TYPE_ROUTE.ordinal()) { - mDrivingRouteOverlay.addDriftRouteToMap(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRouteDriftPoints(), OverlayManager.COLOR_ROUTE_DRIFT); + mDrivingRouteOverlay.addDriftRouteToMap(GpsMockManager.getInstance().getBdMockDrivingRouteLine(), OverlayManager.COLOR_ROUTE_DRIFT, mCbDriftLostLoc.isChecked()); mTvMockDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRouteDriftDistance())); } else { - mDrivingRouteOverlay.addDriftRandomRouteToMap(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRandomDriftPoints(), OverlayManager.COLOR_ROUTE_DRIFT); + mDrivingRouteOverlay.addDriftRandomRouteToMap(GpsMockManager.getInstance().getBdMockDrivingRouteLine(), OverlayManager.COLOR_ROUTE_DRIFT, mCbDriftLostLoc.isChecked()); mTvMockDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRandomDriftDistance())); } } @@ -443,6 +452,8 @@ public void onClick(View v) { GpsMockConfig.putRouteMockAccuracy(getInputDriftAccuracy()); GpsMockConfig.putSeekBarLow((int) mSeekBar.getProgressLow()); GpsMockConfig.putSeekBarHigh((int) mSeekBar.getProgressHigh()); + GpsMockConfig.putLostLocSeekBarLow((int) mDriftLostLocSeekBar.getProgressLow()); + GpsMockConfig.putLostLocSeekBarHigh((int) mDriftLostLocSeekBar.getProgressHigh()); if (GpsMockManager.getInstance().isMockingRoute()) { mBtnMockRoute1.setText(R.string.btn_text_start_mock); @@ -473,6 +484,9 @@ private void drawAndMockRoute() { // 漂移路径模拟 // 计算偏移点(手动选择模式) GpsMockManager.getInstance().calculateDriftRoute(getInputDriftAccuracy(), mSeekBar.getProgressLow(), mSeekBar.getProgressHigh()); + if (mCbDriftLostLoc.isChecked()){ + GpsMockManager.getInstance().calculateDriftRouteWithLocLost(mDriftLostLocSeekBar.getProgressLow(), mDriftLostLocSeekBar.getProgressHigh()); + } } else { // 计算漂移点(智能模式)待补齐. @@ -490,8 +504,15 @@ private void drawAndMockRoute() { } else { // 真实路径模拟 if (GpsMockManager.getInstance().getBdMockDrivingRouteLine() != null) { - // 开始模拟 - GpsMockManager.getInstance().startMockRouteLine(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getAllPoints(), getInputSpeed(), this); + if (mCbDriftLostLoc.isChecked()){ + GpsMockManager.getInstance().calculateOriginRouteWithLocLost(mDriftLostLocSeekBar.getProgressLow(), mDriftLostLocSeekBar.getProgressHigh()); + // 开始模拟 + GpsMockManager.getInstance().startMockRouteLine(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getOriginRouteLostLocPoints(), getInputSpeed(), this); + } else { + // 开始模拟 + GpsMockManager.getInstance().startMockRouteLine(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getAllPoints(), getInputSpeed(), this); + } + mBtnMockRoute1.setText(R.string.btn_text_stop_mock); mBtnMockRoute2.setText(R.string.btn_text_stop_mock); } @@ -516,6 +537,9 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { } else if (buttonView.getId() == R.id.cb_toggle_route_drift_mock) { onRouteDriftMockCbChange(isChecked); LogHelper.d(TAG, "cb_toggle_route_drift_mock onCheckedChanged: " + " " + isChecked); + } else if (buttonView.getId() == R.id.cb_toggle_route_lost_loc){ + onLostLocMockCbChange(isChecked); + LogHelper.d(TAG, "cb_toggle_route_lost_loc onCheckedChanged: " + " " + isChecked); } } @@ -627,6 +651,10 @@ private void onRouteDriftMockCbChange(boolean isChecked) { drawRoute(); } + private void onLostLocMockCbChange(boolean isChecked){ + GpsMockConfig.putRouteDriftMockLostLocOpen(isChecked); + } + private float getInputSpeed() { float speed = 60f; try { diff --git a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockManager.java b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockManager.java index a8454a24a..4b7813d4c 100644 --- a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockManager.java +++ b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockManager.java @@ -172,7 +172,7 @@ public void performMock(LatLng latLng) { public void startMockRouteLine(List points, double speed, RouteMockThread.RouteMockStatusCallback statusCallback) { if (isMockingRoute()) return; - if (isMockingRoute() && mRouteMockThread.isSuspend()){ + if (isMockingRoute() && mRouteMockThread.isSuspend()) { suspendRouteMock(false); return; } @@ -189,14 +189,14 @@ public void startMockRouteLine(List points, doubl } } - public void setStatusCallback(RouteMockThread.RouteMockStatusCallback statusCallback){ - if (mRouteMockThread != null){ + public void setStatusCallback(RouteMockThread.RouteMockStatusCallback statusCallback) { + if (mRouteMockThread != null) { mRouteMockThread.setRouteMockStatusCallback(statusCallback); } } - public void removeStatusCallback(){ - if (mRouteMockThread != null){ + public void removeStatusCallback() { + if (mRouteMockThread != null) { mRouteMockThread.clearRouteMockStatusCallback(); } } @@ -204,22 +204,86 @@ public void removeStatusCallback(){ /** * 停止模拟. */ - public void interruptRouteMockThread(){ - if (GpsMockManager.getInstance().isMockingRoute()){ + public void interruptRouteMockThread() { + if (GpsMockManager.getInstance().isMockingRoute()) { mRouteMockThread.interrupt(); } } /** - * * @param suspend true: 暂停模拟; false:继续模拟 */ - public void suspendRouteMock(boolean suspend){ - if (isMockingRoute()){ + public void suspendRouteMock(boolean suspend) { + if (isMockingRoute()) { mRouteMockThread.notifyThread(suspend); } } + public void calculateOriginRouteWithLocLost(double progressLow, double progressHigh) { + BdMapRouteData bdMapRouteData = GpsMockManager.getInstance().getBdMockDrivingRouteLine(); + if (bdMapRouteData == null) return; + List originRoutePoints = bdMapRouteData.getAllPoints(); + int totalPointsSize = originRoutePoints.size(); + if (totalPointsSize < 2) return; + + int startIndex = Math.round((totalPointsSize / 100.0f) * (int) progressLow); + int endIndex = Math.round((totalPointsSize / 100.0f) * (int) progressHigh); + if (endIndex <= startIndex) return; + int startLostIndex = startIndex> 0 ? (startIndex - 1) : 0; + if (endIndex> totalPointsSize) { + endIndex = totalPointsSize - 1; + } + + startIndex = startIndex <= 0 ? 1 : startIndex; + endIndex = endIndex == totalPointsSize ? (endIndex - 1) : endIndex; + com.baidu.mapapi.model.LatLng originRouteStartLostPoint = originRoutePoints.get(startLostIndex); + com.baidu.mapapi.model.LatLng originRouteEndLostPoint = originRoutePoints.get(endIndex); + bdMapRouteData.mOriginRouteStartLostPoint = originRouteStartLostPoint; + bdMapRouteData.mOriginRouteEndLostPoint = originRouteEndLostPoint; + + List tempLostLocOriginRoutePoints = new ArrayList(); + tempLostLocOriginRoutePoints.addAll(originRoutePoints.subList(0, startIndex)); + tempLostLocOriginRoutePoints.addAll(originRoutePoints.subList(endIndex, totalPointsSize)); + bdMapRouteData.setOriginRouteLostLocPoints(tempLostLocOriginRoutePoints); + } + + public void calculateDriftRouteWithLocLost(double progressLow, double progressHigh) { + BdMapRouteData bdMapRouteData = GpsMockManager.getInstance().getBdMockDrivingRouteLine(); + if (bdMapRouteData == null) return; + List randomDriftPoints = bdMapRouteData.getRandomDriftPoints(); + List routeDriftPoints = bdMapRouteData.getRouteDriftPoints(); + int totalPointsSize = randomDriftPoints.size(); + if (totalPointsSize < 2) return; + int startIndex = Math.round((totalPointsSize / 100.0f) * (int) progressLow); + int endIndex = Math.round((totalPointsSize / 100.0f) * (int) progressHigh); + if (endIndex <= startIndex) return; + int startLostIndex = startIndex> 0 ? (startIndex - 1) : 0; + if (endIndex> totalPointsSize) { + endIndex = totalPointsSize - 1; + } + + startIndex = startIndex <= 0 ? 1 : startIndex; + endIndex = endIndex == totalPointsSize ? (endIndex - 1) : endIndex; + + com.baidu.mapapi.model.LatLng randomDriftStartLostPoint = randomDriftPoints.get(startLostIndex); + com.baidu.mapapi.model.LatLng randomDriftEndLostPoint = randomDriftPoints.get(endIndex); + bdMapRouteData.mRandomDriftStartLostPoint = randomDriftStartLostPoint; + bdMapRouteData.mRandomDriftEndLostPoint = randomDriftEndLostPoint; + com.baidu.mapapi.model.LatLng routeDriftStartLostPoint = routeDriftPoints.get(startLostIndex); + com.baidu.mapapi.model.LatLng routeDriftEndLostPoint = routeDriftPoints.get(endIndex); + bdMapRouteData.mRouteDriftStartLostPoint = routeDriftStartLostPoint; + bdMapRouteData.mRouteDriftEndLostPoint = routeDriftEndLostPoint; + + List tempLostLocRandomDriftPoints = new ArrayList(); + tempLostLocRandomDriftPoints.addAll(randomDriftPoints.subList(0, startIndex)); + tempLostLocRandomDriftPoints.addAll(randomDriftPoints.subList(endIndex, totalPointsSize)); + bdMapRouteData.setRandomDriftPoints(tempLostLocRandomDriftPoints); + List tempLostLocRouteDriftPoints = new ArrayList(); + tempLostLocRouteDriftPoints.addAll(routeDriftPoints.subList(0, startIndex)); + tempLostLocRouteDriftPoints.addAll(routeDriftPoints.subList(endIndex, totalPointsSize)); + bdMapRouteData.setRouteDriftPoints(tempLostLocRouteDriftPoints); + } + public void calculateDriftRoute(double radius, double progressLow, double progressHigh) { Double orientLatDiffer = null; BdMapRouteData bdMapRouteData = GpsMockManager.getInstance().getBdMockDrivingRouteLine(); @@ -257,7 +321,7 @@ public void calculateDriftRoute(double radius, double progressLow, double progre double[] randomLatLng = Utils.getRandomLatLng(point.latitude, point.longitude, radius, rangeAround); com.baidu.mapapi.model.LatLng randomPoint = new com.baidu.mapapi.model.LatLng(randomLatLng[0], randomLatLng[1]); randomDriftPoints.add(randomPoint); - }else { + } else { randomDriftPoints.add(point); } @@ -275,13 +339,13 @@ public void calculateDriftRoute(double radius, double progressLow, double progre List end = allPoints.subList(endIndex, totalPointsSize); randomDriftPoints.addAll(randomDriftPoints.size(), end); randomDriftPoints.addAll(0, start); - int randomDriftDistance = (int)Math.round(Utils.getRouteDistance(randomDriftPoints)); + int randomDriftDistance = (int) Math.round(Utils.getRouteDistance(randomDriftPoints)); bdMapRouteData.setRandomDriftPoints(randomDriftPoints); bdMapRouteData.setRandomDriftDistance(randomDriftDistance); routeDriftPoints.addAll(routeDriftPoints.size(), end); routeDriftPoints.addAll(0, start); - int routeDriftDistance = (int)Math.round(Utils.getRouteDistance(routeDriftPoints)); + int routeDriftDistance = (int) Math.round(Utils.getRouteDistance(routeDriftPoints)); bdMapRouteData.setRouteDriftPoints(routeDriftPoints); bdMapRouteData.setRouteDriftDistance(routeDriftDistance); } diff --git a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/DrivingRouteOverlay.java b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/DrivingRouteOverlay.java index a0bbbf2e3..08f645a44 100644 --- a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/DrivingRouteOverlay.java +++ b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/DrivingRouteOverlay.java @@ -24,7 +24,6 @@ public class DrivingRouteOverlay extends OverlayManager { private DrivingRouteLine mRouteLine = null; - private BdMapRouteData mBdMapRouteData; boolean focus = false; /** diff --git a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/OverlayManager.java b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/OverlayManager.java index a5c33d146..a35bcf32b 100644 --- a/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/OverlayManager.java +++ b/Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/OverlayManager.java @@ -24,6 +24,7 @@ import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.model.LatLngBounds; import com.didichuxing.doraemonkit.gps_mock.R; +import com.didichuxing.doraemonkit.gps_mock.common.BdMapRouteData; import com.didichuxing.doraemonkit.util.ConvertUtils; import java.util.ArrayList; @@ -45,13 +46,14 @@ public abstract class OverlayManager implements OnMarkerClickListener, OnPolylineClickListener { BaiduMap mBaiduMap = null; + protected BdMapRouteData mBdMapRouteData; private List mOverlayOptionList = null; List mOriginRouteOverlayList = null; // 漂移路线 - private Overlay mDriftRouteOverlay; - private Overlay mDriftRandomOverlay; + // private Overlay mDriftRouteOverlay; + // private Overlay mDriftRandomOverlay; // 实时坐标 private Overlay mLocMarkOverlay; private Bitmap mLocMarkBitmap; @@ -60,6 +62,9 @@ public abstract class OverlayManager implements OnMarkerClickListener, OnPolylin public static final int COLOR_ROUTE_DRIFT = 0x80FF0000; public static final int COLOR_ROUTE = 0xBF004EFF; + public static final int COLOR_LOST_LOC_POINT = 0xFFFFFF00; //黄色 + public static final int COLOR_LOST_LOC_LINE = 0xFFD2691E; + public static final int LOST_LOC_POINT_DOT_RADIUS = 16; /** * 通过一个BaiduMap 对象构造 @@ -89,12 +94,12 @@ public OverlayManager(BaiduMap baiduMap) { /** * 将所有Overlay 添加到地图上 */ - public final void addToMap() { + public final void addToMap(boolean lostLocChecked) { if (mBaiduMap == null) { return; } - removeOriginRouteFromMap(); + removeAllRouteFromMap(); List overlayOptions = getOverlayOptions(); if (overlayOptions != null) { mOverlayOptionList.addAll(overlayOptions); @@ -103,10 +108,23 @@ public final void addToMap() { for (OverlayOptions option : mOverlayOptionList) { mOriginRouteOverlayList.add(mBaiduMap.addOverlay(option)); } + + List points = mBdMapRouteData.getOriginRouteLostLocPoints(); + if (points == null || points.size() <= 0) return; + + OverlayOptions originRouteLostLocOverlayOption = getPolylineOptions(points, COLOR_LOST_LOC_LINE); + mOriginRouteOverlayList.add(mBaiduMap.addOverlay(originRouteLostLocOverlayOption)); + + if (lostLocChecked && mBdMapRouteData != null && mBdMapRouteData.mOriginRouteStartLostPoint != null && mBdMapRouteData.mOriginRouteEndLostPoint != null) { + mOriginRouteOverlayList.add(addDotToMap(mBdMapRouteData.mOriginRouteStartLostPoint, LOST_LOC_POINT_DOT_RADIUS, COLOR_LOST_LOC_POINT)); + mOriginRouteOverlayList.add(addDotToMap(mBdMapRouteData.mOriginRouteEndLostPoint, LOST_LOC_POINT_DOT_RADIUS, COLOR_LOST_LOC_POINT)); + } } + List mDriftRouteOverlayList = new ArrayList(); - public final void addDriftRouteToMap(List points, int lineColor) { + public final void addDriftRouteToMap(BdMapRouteData bdMapRouteData, int lineColor, boolean lostLocChecked) { + List points = bdMapRouteData.getRouteDriftPoints(); if (points == null || points.size() <= 0) return; if (mBaiduMap == null) { @@ -115,7 +133,21 @@ public final void addDriftRouteToMap(List points, int lineColor) { removeDriftRouteFromMap(); OverlayOptions driftOverlayOption = getPolylineOptions(points, lineColor); - mDriftRouteOverlay = mBaiduMap.addOverlay(driftOverlayOption); + mDriftRouteOverlayList.add(mBaiduMap.addOverlay(driftOverlayOption)); + + if (lostLocChecked) { + if (bdMapRouteData.mRouteDriftStartLostPoint != null) { + mDriftRouteOverlayList.add(addDotToMap(bdMapRouteData.mRouteDriftStartLostPoint, LOST_LOC_POINT_DOT_RADIUS, COLOR_LOST_LOC_POINT)); + } + + if (bdMapRouteData.mRouteDriftEndLostPoint != null) { + mDriftRouteOverlayList.add(addDotToMap(bdMapRouteData.mRouteDriftEndLostPoint, LOST_LOC_POINT_DOT_RADIUS, COLOR_LOST_LOC_POINT)); + } + } + } + + public final Overlay addDotToMap(LatLng point, int radiusPx, int color) { + return addPointMark(point, radiusPx, color); } private final List mDriftRandomDotOverlay = new ArrayList(); @@ -129,11 +161,14 @@ public final void addDriftRandomDotToMap(List points, int color) { removeDriftRouteFromMap(); for (LatLng latLng : points) { - mDriftRandomDotOverlay.add(addPointMark(latLng, 8, color)); + mDriftRandomDotOverlay.add(addDotToMap(latLng, 8, color)); } } - public final void addDriftRandomRouteToMap(List points, int lineColor) { + private final List mDriftRandomOverlayList = new ArrayList(); + + public final void addDriftRandomRouteToMap(BdMapRouteData bdMapRouteData, int lineColor, boolean lostLocChecked) { + List points = bdMapRouteData.getRandomDriftPoints(); if (points == null || points.size() <= 0) return; if (mBaiduMap == null) { @@ -142,7 +177,17 @@ public final void addDriftRandomRouteToMap(List points, int lineColor) { removeDriftRouteFromMap(); OverlayOptions driftOverlayOption = getPolylineOptions(points, lineColor); - mDriftRandomOverlay = mBaiduMap.addOverlay(driftOverlayOption); + mDriftRandomOverlayList.add(mBaiduMap.addOverlay(driftOverlayOption)); + + if (lostLocChecked) { + if (bdMapRouteData.mRandomDriftStartLostPoint != null) { + mDriftRandomOverlayList.add(addDotToMap(bdMapRouteData.mRandomDriftStartLostPoint, LOST_LOC_POINT_DOT_RADIUS, COLOR_LOST_LOC_POINT)); + } + + if (bdMapRouteData.mRandomDriftEndLostPoint != null) { + mDriftRandomOverlayList.add(addDotToMap(bdMapRouteData.mRandomDriftEndLostPoint, LOST_LOC_POINT_DOT_RADIUS, COLOR_LOST_LOC_POINT)); + } + } } private Bitmap getBitmap(int vectorDrawableId) { @@ -200,22 +245,25 @@ public final Overlay addPointMark(LatLng latLng, int radiusPx, int color) { .color(color)); } - public final void removeAllRouteFromMap(){ + public final void removeAllRouteFromMap() { removeOriginRouteFromMap(); removeDriftRouteFromMap(); } - public final void removeDriftRouteFromMap(){ + public final void removeDriftRouteFromMap() { if (mBaiduMap == null) { return; } - if (mDriftRandomOverlay != null) { - mDriftRandomOverlay.remove(); + if (mDriftRouteOverlayList.size()> 0) { + for (Overlay overlay : mDriftRouteOverlayList) { + overlay.remove(); + } } - - if (mDriftRouteOverlay != null) { - mDriftRouteOverlay.remove(); + if (mDriftRandomOverlayList.size()> 0) { + for (Overlay overlay : mDriftRandomOverlayList) { + overlay.remove(); + } } if (mDriftRandomDotOverlay.size()> 0) { diff --git a/Android/dokit-gps-mock/src/main/res/layout/dk_fragment_gps_mock.xml b/Android/dokit-gps-mock/src/main/res/layout/dk_fragment_gps_mock.xml index 67aecf75f..af3d406b5 100644 --- a/Android/dokit-gps-mock/src/main/res/layout/dk_fragment_gps_mock.xml +++ b/Android/dokit-gps-mock/src/main/res/layout/dk_fragment_gps_mock.xml @@ -260,16 +260,70 @@ app:layout_constraintLeft_toLeftOf="@id/guide_line_vertical_center" app:layout_constraintTop_toTopOf="@id/edt_route_speed" /> + + + + + + + + + +