提交 c21e6b78 编写于 作者: H henryhe

feat(Android):抽离位置模拟功能;完善位置和路径导航模拟功能.

上级 ee31e988
......@@ -11,7 +11,7 @@ if (runType == 0) {
// debugImplementation project(":dokit-weex")
// debugImplementation project(":dokit-rpc")
// debugImplementation project(":dokit-rpc-mc")
// debugImplementation project(":dokit-dmap")
debugImplementation project(":dokit-gps-mock")
releaseImplementation project(":dokit-no-op")
}
} else if (runType == 1) {
......@@ -23,6 +23,7 @@ if (runType == 0) {
debugImplementation "io.github.didi.dokit:dokitx-ft:${rootProject.ext.publish_config["version"]}"
debugImplementation "io.github.didi.dokit:dokitx-mc:${rootProject.ext.publish_config["version"]}"
debugImplementation "io.github.didi.dokit:dokitx-weex:${rootProject.ext.publish_config["version"]}"
debugImplementation "io.github.didi.dokit:dokit-gps-mock:${rootProject.ext.publish_config["version"]}"
releaseImplementation "io.github.didi.dokit:dokitx-no-op:${rootProject.ext.publish_config["version"]}"
}
}
......@@ -11,7 +11,7 @@ import android.widget.TextView;
import com.didichuxing.doraemondemo.R;
import com.didichuxing.doraemondemo.dokit.SimpleDokitView;
import com.didichuxing.doraemonkit.kit.lbs.route.FloatGpsRouteMockCache;
import com.didichuxing.doraemonkit.gps_mock.lbs.route.FloatGpsRouteMockCache;
public class FloatGpsMockRouteKitView extends SimpleDokitView {
public static final String TAG = "FloatGpsMockRoutKitView";
......
......@@ -9,10 +9,10 @@ import android.widget.TextView;
import com.didichuxing.doraemondemo.R;
import com.didichuxing.doraemondemo.dokit.SimpleDokitView;
import com.didichuxing.doraemonkit.kit.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.kit.lbs.manual.FloatGpsMockCache;
import com.didichuxing.doraemonkit.kit.lbs.preset.FloatGpsPresetMockCache;
import com.didichuxing.doraemonkit.kit.lbs.preset.MockLocList;
import com.didichuxing.doraemonkit.gps_mock.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.gps_mock.lbs.manual.FloatGpsMockCache;
import com.didichuxing.doraemonkit.gps_mock.lbs.preset.FloatGpsPresetMockCache;
import com.didichuxing.doraemonkit.gps_mock.lbs.preset.MockLocList;
import com.google.android.flexbox.FlexboxLayout;
import java.util.ArrayList;
......
......@@ -23,7 +23,13 @@ import androidx.recyclerview.widget.LinearLayoutManager
import coil.imageLoader
import coil.request.CachePolicy
import coil.transform.CircleCropTransformation
import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationClientOption
import com.amap.api.location.AMapLocationListener
import com.amap.api.navi.AMapNavi
import com.amap.api.navi.AMapNaviListener
import com.amap.api.navi.enums.PathPlanningStrategy
import com.amap.api.navi.model.*
import com.blankj.utilcode.util.*
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestBuilder
......@@ -55,6 +61,7 @@ import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.scalars.ScalarsConverterFactory
import java.io.*
import java.net.*
import java.util.HashMap
import kotlin.coroutines.resume
/**
......@@ -106,6 +113,7 @@ class MainDebugActivityOkhttpV3 : BaseActivity(), View.OnClickListener, Coroutin
"模拟内存泄漏",
"函数调用耗时(TAG:MethodCostUtil)",
"获取位置信息(系统)",
"获取位置信息(高德)",
"高德路径规划",
"OkHttp Mock",
"HttpURLConnection Mock",
......@@ -220,6 +228,9 @@ class MainDebugActivityOkhttpV3 : BaseActivity(), View.OnClickListener, Coroutin
"获取位置信息(系统)" -> {
startNormaLocation()
}
"获取位置信息(高德)" ->{
startAMapLocation()
}
"高德路径规划" -> {
CommLauncher.startActivity(AMapRouterFragment::class.java, this)
}
......@@ -382,6 +393,36 @@ class MainDebugActivityOkhttpV3 : BaseActivity(), View.OnClickListener, Coroutin
)
}
/**
* 启动高德定位
*/
private fun startAMapLocation() {
// 确保调用SDK任何接口前先调用更新隐私合规updatePrivacyShow、updatePrivacyAgree两个接口并且参数值都为true,若未正确设置有崩溃风险
AMapLocationClient.updatePrivacyShow(this, true, true)
AMapLocationClient.updatePrivacyAgree(this, true)
//声明mLocationOption对象
var mLocationOption: AMapLocationClientOption? = null
val mlocationClient = AMapLocationClient(this)
//初始化定位参数
mLocationOption = AMapLocationClientOption()
//设置定位监听
mlocationClient!!.setLocationListener(mapLocationListener)
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.interval = 2000
//设置定位参数
mlocationClient!!.setLocationOption(mLocationOption)
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
//启动定位
mlocationClient!!.startLocation()
}
/**
* 启动高德定位服务
*/
......
......@@ -160,12 +160,6 @@ task checkUploadConfig4Maven() {
if (!modules.contains("dokit-plugin")) {
throw new RuntimeException("未找到dokit-plugin module。。。")
}
// if (!modules.contains("dokit-dmap")) {
// throw new RuntimeException("未找到dokit-dmap module。。。")
// }
}
}
......@@ -202,11 +196,6 @@ task checkUploadConfig4Local() {
if (!modules.contains("dokit-plugin")) {
throw new RuntimeException("未找到dokit-plugin module。。。")
}
// if (!modules.contains("dokit-dmap")) {
// throw new RuntimeException("未找到dokit-dmap module。。。")
// }
}
}
......@@ -242,11 +231,6 @@ task checkUploadConfig4Didi() {
if (!modules.contains("dokit-plugin")) {
throw new RuntimeException("未找到dokit-plugin module。。。")
}
// if (!modules.contains("dokit-dmap")) {
// throw new RuntimeException("未找到dokit-dmap module。。。")
// }
}
}
......
......@@ -82,7 +82,7 @@ class CommClassTransformer : AbsClassTransformer() {
it,
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/location/GpsStatusUtil",
"com/didichuxing/doraemonkit/gps_mock/location/GpsStatusUtil",
"wrap",
"(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;",
false
......@@ -135,28 +135,28 @@ class CommClassTransformer : AbsClassTransformer() {
// }
//插入高德地图导航相关字节码
// if (className == "com.amap.api.navi.AMapNavi") {
// //设置监听器
// klass.methods?.find {
// it.name == "addAMapNaviListener"
// }.let { methodNode ->
// "${context.projectDir.lastPath()}->hook amap map navi succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
// methodNode?.instructions?.insert(createAmapNaviInsnList())
// }
if (className == "com.amap.api.navi.AMapNavi") {
//设置监听器
klass.methods?.find {
it.name == "addAMapNaviListener"
}.let { methodNode ->
"${context.projectDir.lastPath()}->hook amap map navi succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
methodNode?.instructions?.insert(createAmapNaviInsnList())
}
//
// //反注册监听器
// klass.methods?.find {
// it.name == "removeAMapNaviListener"
// }.let { methodNode ->
// "${context.projectDir.lastPath()}->hook amap map navi succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
// methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {
// methodNode.instructions.insertBefore(
// it,
// createAmapNaviUnRegisterInsnList()
// )
// }
// }
// }
klass.methods?.find {
it.name == "removeAMapNaviListener"
}.let { methodNode ->
"${context.projectDir.lastPath()}->hook amap map navi succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {
methodNode.instructions.insertBefore(
it,
createAmapNaviUnRegisterInsnList()
)
}
}
}
//插入腾讯地图相关字节码
......@@ -227,19 +227,6 @@ class CommClassTransformer : AbsClassTransformer() {
}
}
}
// 插入新四地图相关字节码
if (className == "com.didichuxing.bigdata.dp.locsdk.DIDILocationManager") {
// 持续定位和单次定位
klass.methods?.filter {
it.name == "requestLocationUpdateOnce" || it.name == "requestLocationUpdates"
}?.forEach { methodNode ->
"${context.projectDir.lastPath()}->hook didi map succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
methodNode?.instructions?.insert(createDMapLocationListenerInsnList())
}
// 反注册监听器
}
}
......@@ -754,15 +741,15 @@ class CommClassTransformer : AbsClassTransformer() {
*/
private fun createAmapLocationInsnList(): InsnList {
return with(InsnList()) {
//在AMapLocationClient的setLocationListener方法之中插入自定义代理回调类
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/AMapLocationListenerProxy"))
//在AMapLocationClient的 setLocationListener 方法之中插入自定义代理回调类
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/gps_mock/map/AMapLocationListenerProxy"))
add(InsnNode(DUP))
//访问第一个参数
add(VarInsnNode(ALOAD, 1))
add(
MethodInsnNode(
INVOKESPECIAL,
"com/didichuxing/doraemonkit/aop/map/AMapLocationListenerProxy",
"com/didichuxing/doraemonkit/gps_mock/map/AMapLocationListenerProxy",
"<init>",
"(Lcom/amap/api/location/AMapLocationListener;)V",
false
......@@ -781,14 +768,14 @@ class CommClassTransformer : AbsClassTransformer() {
private fun createAmapNaviInsnList(): InsnList {
return with(InsnList()) {
//在AMapNavi的addAMapNaviListener方法之中插入自定义代理回调类
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/AMapNaviListenerProxy"))
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/gps_mock/map/AMapNaviListenerProxy"))
add(InsnNode(DUP))
//访问第一个参数
add(VarInsnNode(ALOAD, 1))
add(
MethodInsnNode(
INVOKESPECIAL,
"com/didichuxing/doraemonkit/aop/map/AMapNaviListenerProxy",
"com/didichuxing/doraemonkit/gps_mock/map/AMapNaviListenerProxy",
"<init>",
"(Lcom/amap/api/navi/AMapNaviListener;)V",
false
......@@ -808,14 +795,14 @@ class CommClassTransformer : AbsClassTransformer() {
private fun createAmapLocationSourceInsnList(): InsnList {
return with(InsnList()) {
//在AMapNavi的addAMapNaviListener方法之中插入自定义代理回调类
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/AMapLocationSourceProxy"))
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/gps_mock/map/AMapLocationSourceProxy"))
add(InsnNode(DUP))
//访问第一个参数
add(VarInsnNode(ALOAD, 1))
add(
MethodInsnNode(
INVOKESPECIAL,
"com/didichuxing/doraemonkit/aop/map/AMapLocationSourceProxy",
"com/didichuxing/doraemonkit/gps_mock/map/AMapLocationSourceProxy",
"<init>",
"(Lcom/amap/api/maps/LocationSource;)V",
false
......@@ -837,7 +824,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/map/AMapLocationClientProxy",
"com/didichuxing/doraemonkit/gps_mock/map/AMapLocationClientProxy",
"getLastKnownLocation",
"(Lcom/amap/api/location/AMapLocationClient;)Lcom/amap/api/location/AMapLocation;",
false
......@@ -861,7 +848,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
"unRegisterAmapLocationListener",
"(Lcom/amap/api/location/AMapLocationListener;)V",
false
......@@ -882,7 +869,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
"unRegisterAmapNaviListener",
"(Lcom/amap/api/navi/AMapNaviListener;)V",
false
......@@ -903,7 +890,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
TypeInsnNode(
NEW,
"com/didichuxing/doraemonkit/aop/map/TencentLocationListenerProxy"
"com/didichuxing/doraemonkit/gps_mock/map/TencentLocationListenerProxy"
)
)
add(InsnNode(DUP))
......@@ -912,7 +899,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
MethodInsnNode(
INVOKESPECIAL,
"com/didichuxing/doraemonkit/aop/map/TencentLocationListenerProxy",
"com/didichuxing/doraemonkit/gps_mock/map/TencentLocationListenerProxy",
"<init>",
"(Lcom/tencent/map/geolocation/TencentLocationListener;)V",
false
......@@ -937,7 +924,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
"unRegisterTencentLocationListener",
"(Lcom/tencent/map/geolocation/TencentLocationListener;)V",
false
......@@ -955,14 +942,14 @@ class CommClassTransformer : AbsClassTransformer() {
private fun createBDLocationListenerInsnList(): InsnList {
return with(InsnList()) {
//在LocationClient的registerLocationListener方法之中插入自定义代理回调类
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/BDLocationListenerProxy"))
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/gps_mock/map/BDLocationListenerProxy"))
add(InsnNode(DUP))
//访问第一个参数
add(VarInsnNode(ALOAD, 1))
add(
MethodInsnNode(
INVOKESPECIAL,
"com/didichuxing/doraemonkit/aop/map/BDLocationListenerProxy",
"com/didichuxing/doraemonkit/gps_mock/map/BDLocationListenerProxy",
"<init>",
"(Lcom/baidu/location/BDLocationListener;)V",
false
......@@ -982,14 +969,14 @@ class CommClassTransformer : AbsClassTransformer() {
private fun createBDLocationAbsListenerInsnList(): InsnList {
return with(InsnList()) {
//在LocationClient的registerLocationListener方法之中插入自定义代理回调类
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/BDAbsLocationListenerProxy"))
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/gps_mock/map/BDAbsLocationListenerProxy"))
add(InsnNode(DUP))
//访问第一个参数
add(VarInsnNode(ALOAD, 1))
add(
MethodInsnNode(
INVOKESPECIAL,
"com/didichuxing/doraemonkit/aop/map/BDAbsLocationListenerProxy",
"com/didichuxing/doraemonkit/gps_mock/map/BDAbsLocationListenerProxy",
"<init>",
"(Lcom/baidu/location/BDAbstractLocationListener;)V",
false
......@@ -1012,7 +999,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
"unRegisterBDLocationListener",
"(Lcom/baidu/location/BDLocationListener;)V",
false
......@@ -1033,7 +1020,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/map/ThirdMapLocationListenerUtil",
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
"unRegisterBDLocationListener",
"(Lcom/baidu/location/BDAbstractLocationListener;)V",
false
......@@ -1054,7 +1041,7 @@ class CommClassTransformer : AbsClassTransformer() {
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/BDLocationUtil",
"com/didichuxing/doraemonkit/gps_mock/map/BDLocationUtil",
"proxy",
"(Lcom/baidu/location/BDLocation;)Lcom/baidu/location/BDLocation;",
false
......@@ -1067,32 +1054,6 @@ class CommClassTransformer : AbsClassTransformer() {
}
/**
* 创建新四地图代码指令
*/
private fun createDMapLocationListenerInsnList(): InsnList {
return with(InsnList()) {
//在DIDILocationManager的requestLocationUpdateOnce方法之中插入自定义代理回调类
add(TypeInsnNode(NEW, "com/didichuxing/doraemonkit/aop/map/DMapLocationListenerProxy"))
add(InsnNode(DUP))
//访问第一个参数
add(VarInsnNode(ALOAD, 1))
add(
MethodInsnNode(
INVOKESPECIAL,
"com/didichuxing/doraemonkit/aop/map/DMapLocationListenerProxy",
"<init>",
"(Lcom/didichuxing/bigdata/dp/locsdk/DIDILocationListener;)V",
false
)
)
//对第一个参数进行重新赋值
add(VarInsnNode(ASTORE, 1))
this
}
}
/**
* 创建OkhttpClient一个数构造函数指令
*/
......
......@@ -24,7 +24,7 @@ open class DoKitBaseTransform protected constructor(val project: Project) : Tran
* Preload transformers as List to fix NoSuchElementException caused by ServiceLoader in parallel mode
* booster 的默认出炉逻辑 DoKit已重写自处理
*/
internal open val transformers = listOf<Transformer>()
open val transformers = listOf<Transformer>()
internal val verifyEnabled = project.getProperty(OPT_TRANSFORM_VERIFY, false)
......@@ -86,4 +86,4 @@ open class DoKitBaseTransform protected constructor(val project: Project) : Tran
/**
* The option for transform outputs verifying, default is false
*/
private const val OPT_TRANSFORM_VERIFY = "dokit.transform.verify"
\ No newline at end of file
private const val OPT_TRANSFORM_VERIFY = "dokit.transform.verify"
......@@ -9,7 +9,7 @@ import com.didichuxing.doraemonkit.plugin.stack_method.MethodStackNodeUtil
import com.didiglobal.booster.transform.Transformer
import org.gradle.api.Project
internal class DoKitCommTransformV34(project: Project) : DoKitBaseTransform(project) {
class DoKitCommTransformV34(project: Project) : DoKitBaseTransform(project) {
override val transformers = listOf<Transformer>(
......
......@@ -14,7 +14,6 @@ ext {
use_local : true,
group_id : 'io.github.didi.dokit',
version : '3.6.0.8'
]
android = [compileSdkVersion : 29,
......@@ -141,8 +140,6 @@ ext {
"amap_map3d" : 'com.amap.api:map3d:latest.integration',
"amap_search" : 'com.amap.api:search:latest.integration',
"amap_navi" : 'com.amap.api:navi-3dmap:latest.integration',
//新四地图
"dmap" : 'com.didi.nav.driving:sdk:0.0.2065',
//腾讯地图定位
"tencent_location" : 'com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.2.5',
"tencent_map" : 'com.tencent.map:tencent-map-vector-sdk:4.4.0',
......
ARTIFACT_ID=dokitx-dmap
\ No newline at end of file
package com.didichuxing.doraemonkit.aop.map;
import android.location.Location;
import androidx.annotation.NonNull;
import com.didichuxing.bigdata.dp.locsdk.DIDILocation;
import com.didichuxing.bigdata.dp.locsdk.DIDILocationListener;
import com.didichuxing.bigdata.dp.locsdk.ErrInfo;
import com.didichuxing.bigdata.dp.locsdk.trace.data.ETraceSource;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockProxyManager;
/**
* Created by mmxb on 2021/9/13.
*/
public class DMapLocationListenerProxy implements DIDILocationListener, DMapLocationListener {
public DIDILocationListener didiLocationListener;
public DMapLocationListenerProxy(DIDILocationListener didiLocationListener) {
this.didiLocationListener = didiLocationListener;
GpsMockProxyManager.INSTANCE.addDMapLocationListenerProxy(this);
}
@Override
public void onLocationChanged(DIDILocation didiLocation) {
if (didiLocationListener != null) {
didiLocationListener.onLocationChanged(didiLocation);
}
}
@Override
public void onLocationError(int i, ErrInfo errInfo) {
if (didiLocationListener != null) {
didiLocationListener.onLocationError(i, errInfo);
}
}
@Override
public void onStatusUpdate(String s, int i, String s1) {
if (didiLocationListener != null) {
didiLocationListener.onStatusUpdate(s, i, s1);
}
}
@NonNull
@Override
public Object getDMapLocation() {
return didiLocationListener;
}
@Override
public void onLocationChange(Location location) {
DIDILocation didiLocation = DIDILocation.loadFromSystemLoc(location, ETraceSource.cache, 0);
if (didiLocationListener != null) {
didiLocationListener.onLocationChanged(didiLocation);
}
}
}
apply plugin: 'com.android.library'
plugins {
id 'com.android.library'
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply from: '../upload.gradle'
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
......@@ -13,9 +14,8 @@ android {
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
lintOptions {
abortOnError false
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
......@@ -32,9 +32,57 @@ android {
lintOptions {
abortOnError false
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
sourceSets {
debug {
jniLibs.srcDir 'libs'
}
release {
jniLibs.srcDir 'libs'
}
}
}
dependencies {
compileOnly rootProject.ext.dependencies["dmap"]
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation rootProject.ext.dependencies["core-ktx"]
implementation rootProject.ext.dependencies["activity-ktx"]
if (needKotlinV14()) {
implementation rootProject.ext.dependencies["kotlin_v14"]
implementation rootProject.ext.dependencies["coroutines-core_v14"]
} else {
implementation rootProject.ext.dependencies["kotlin_v13"]
implementation rootProject.ext.dependencies["coroutines-core_v13"]
}
implementation project(':dokit-util')
implementation project(':dokit')
//auto-service
implementation rootProject.ext.dependencies["auto_service"]
kapt rootProject.ext.dependencies["auto_service"]
api files('libs/BaiduLBS_Android.jar')
compileOnly rootProject.ext.dependencies["amap_location"]
//高德导航
compileOnly rootProject.ext.dependencies["amap_navi"]
//腾讯地图定位
compileOnly rootProject.ext.dependencies["tencent_location"]
}
package com.didichuxing.doraemonkit;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.didichuxing.doraemonkit.test", appContext.getPackageName());
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.didichuxing.doraemonkit.dmap">
package="com.didichuxing.doraemonkit.gps_mock">
</manifest>
\ No newline at end of file
</manifest>
package com.didichuxing.doraemonkit.kit.filemanager.ability
import com.didichuxing.doraemonkit.constant.DoKitModule
import com.didichuxing.doraemonkit.kit.core.DokitAbility
import com.google.auto.service.AutoService
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2021/6/7-19:50
* 描 述:
* 修订历史:
* ================================================
*/
@AutoService(DokitAbility::class)
class DokitGpsMockAbility : DokitAbility {
override fun init() {
}
override fun moduleName(): DoKitModule {
return DoKitModule.MODULE_GPS_MOCK
}
override fun getModuleProcessor(): DokitAbility.DokitModuleProcessor {
return DokitGpsMockModuleProcessor()
}
}
package com.didichuxing.doraemonkit.kit.filemanager.ability
import com.baidu.mapapi.SDKInitializer
import com.didichuxing.doraemonkit.DoKitEnv.app
import com.didichuxing.doraemonkit.config.GpsMockConfig
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager
import com.didichuxing.doraemonkit.gps_mock.gpsmock.ServiceHookManager
import com.didichuxing.doraemonkit.kit.core.DokitAbility
import java.lang.Exception
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2021/6/7-19:50
* 描 述:
* 修订历史:
* ================================================
*/
class DokitGpsMockModuleProcessor : DokitAbility.DokitModuleProcessor {
override fun values(): Map<String, Any> {
return mapOf()
}
override fun proceed(actions: Map<String, Any?>?): Map<String, Any> {
try {
actions?.let {
when (actions["action"]) {
"init_gps_mock" -> {
if (GpsMockConfig.isGPSMockOpen()) {
GpsMockManager.getInstance().startMock()
}
val latLng = GpsMockConfig.getMockLocation()
latLng?.let{it2 -> GpsMockManager.getInstance().mockLocationWithNotify(it2.latitude, it2.longitude)}
// 在Application里进行初始化,否则在使用百度SDK的接口时,会报so库链接错误.
SDKInitializer.initialize(app)
//Hook WIFI GPS Telephony系统服务
app?.let { it1 -> ServiceHookManager.install(it1.applicationContext) }
}
else -> {
}
}
}
}catch (e:Exception){
e.printStackTrace()
}
return mapOf()
}
}
package com.didichuxing.doraemonkit.gps_mock.common;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.RouteNode;
import java.util.ArrayList;
import java.util.List;
public class BdMapRouteData {
private final List<LatLng> mAllPoints = new ArrayList<>();
// 单位米
private int mTotalDistance;
private RouteNode mStartNode;
private RouteNode mTerminalNode;
// 路线数据是否来自业务方的路径规划
private boolean mRouteDataFromBiz = true;
List<com.baidu.mapapi.model.LatLng> mRandomDriftPoints = new ArrayList<>();
List<com.baidu.mapapi.model.LatLng> mRouteDriftPoints = new ArrayList<>();
private int mRandomDriftDistance;
private int mRouteDriftDistance;
public List<LatLng> getAllPoints() {
return mAllPoints;
}
public void setAllPoints(List<LatLng> allPoints) {
mAllPoints.clear();
mAllPoints.addAll(allPoints);
}
public int getTotalDistance() {
return mTotalDistance;
}
public void setTotalDistance(int totalDistance) {
mTotalDistance = totalDistance;
}
public RouteNode getStartNode() {
return mStartNode;
}
public void setStartNode(RouteNode startNode) {
mStartNode = startNode;
}
public RouteNode getTerminalNode() {
return mTerminalNode;
}
public void setTerminalNode(RouteNode terminalNode) {
mTerminalNode = terminalNode;
}
public List<LatLng> getRandomDriftPoints() {
return mRandomDriftPoints;
}
public void setRandomDriftPoints(List<LatLng> randomDriftPoints) {
mRandomDriftPoints.clear();
mRandomDriftPoints.addAll(randomDriftPoints);
}
public List<LatLng> getRouteDriftPoints() {
return mRouteDriftPoints;
}
public void setRouteDriftPoints(List<LatLng> routeDriftPoints) {
mRouteDriftPoints.clear();
mRouteDriftPoints.addAll(routeDriftPoints);
}
public boolean isRouteDataFromBiz() {
return mRouteDataFromBiz;
}
public void setRouteDataFromBiz(boolean routeDataFromBiz) {
mRouteDataFromBiz = routeDataFromBiz;
}
public int getRandomDriftDistance() {
return mRandomDriftDistance;
}
public void setRandomDriftDistance(int randomDriftDistance) {
mRandomDriftDistance = randomDriftDistance;
}
public int getRouteDriftDistance() {
return mRouteDriftDistance;
}
public void setRouteDriftDistance(int routeDriftDistance) {
mRouteDriftDistance = routeDriftDistance;
}
}
package com.didichuxing.doraemonkit.gps_mock.common;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.DistanceUtil;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
public class Utils {
private static final double PI = 3.14159265;
public static ValueAnimator createDropAnimator(final View v, int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(arg0 -> {
int value = (int) arg0.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height = value;
v.setLayoutParams(layoutParams);
});
return animator;
}
public static Animator createAlphaAnimator(View view, float start, float end) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", start, end);
return animator;
}
public static Animator createRotateAnimator(View view, float start, float end) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotation", start, end);
animator.setDuration(300);
return animator;
}
/**
* 功能:通过反射 设置指定类对象中的 指定属性的值
*
* @param obj 类对象
* @param propertyName 要设置的属性名
* @param propertyvalue 要设置的属性的值
*/
public static void set(Object obj, String propertyName, Object propertyvalue) {
try {
// step1 获取属性指针
Field declaredField = obj.getClass().getDeclaredField(propertyName);
// step2 设置属性可访问
declaredField.setAccessible(true);
// step3 设置属性的值
declaredField.set(obj, propertyvalue);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param radius 单位米
* @return minLat, minLng, maxLat, maxLng
*/
public static double[] getAround(double centerLat, double centerLng, double radius) {
double degree = (24901 * 1609) / 360.0;
double dpmLat = 1 / degree;
double radiusLat = dpmLat * radius;
double minLat = centerLat - radiusLat;
double maxLat = centerLat + radiusLat;
double mpdLng = degree * Math.cos(centerLat * (PI / 180));
double dpmLng = 1 / mpdLng;
double radiusLng = dpmLng * radius;
double minLng = centerLng - radiusLng;
double maxLng = centerLng + radiusLng;
Log.d("range_lat_lng", "[" + minLat + "," + minLng + "," + maxLat + "," + maxLng + "]");
return new double[]{minLat, minLng, maxLat, maxLng};
}
public static double getDistance(LatLng startLagLng, LatLng desLagLng) {
double distance = DistanceUtil.getDistance(startLagLng, desLagLng);
Log.d("distance_between", "startLagLng=" + startLagLng.toString() + " desLagLng=" + desLagLng.toString() + " distance=" + distance);
return distance;
}
/**
* 获取一段路径的总路程.
*/
public static double getRouteDistance(List<LatLng> points) {
if (points == null || points.size() <= 0) return 0;
double distance = 0;
for (int i = 0; i + 1 < points.size(); i++) {
distance += getDistance(points.get(i), points.get(i + 1));
}
return distance;
}
/**
* 获取随机坐标点:根据给定的圆心,半径和随机生成的目标纬度坐标, 获取随机的经度坐标
*/
public static double[] getRandomLatLng(double latitude, double longitude, double radius, double[] rangeAround) {
// 获取随机纬度坐标
double randomLat = rangeAround[0] + (rangeAround[2] - rangeAround[0]) * Math.random();
// 直角三角形一条直角边长度
double y = getDistance(new LatLng(randomLat, longitude), new LatLng(latitude, longitude));
// 计算直接三角形另一条直角边长度
double x = Math.sqrt(Math.pow(radius, 2) - Math.pow(y, 2));
// 根据x长度换算出对应经度值
double differLng = (x / radius) * ((rangeAround[3] - rangeAround[1]) / 2);
Random random = new Random();
// 生成对应的随机经度坐标
double randomLng = longitude + (random.nextBoolean() ? differLng : -differLng);
return new double[]{randomLat, randomLng};
}
/**
* 获取纬度漂移偏移量
*/
public static double getOrientLatDiffer(double[] rangeAround) {
return ((rangeAround[2] - rangeAround[0]) / 2) * Math.random();
}
/**
* 获取定向坐标点(给路径漂移制造漂移点)
*/
public static double[] getOrientationLatLng(double centerLat, double centerLng, double radius, double[] rangeAround, double latDiffer) {
double destRandomLat = centerLat + latDiffer;
// 直角三角形一条直角边长度
double y = getDistance(new LatLng(destRandomLat, centerLng), new LatLng(centerLat, centerLng));
// 计算直接三角形另一条直角边长度
double x = Math.sqrt(Math.pow(radius, 2) - Math.pow(y, 2));
// 根据x长度换算出对应经度值
double differLng = (x / radius) * ((rangeAround[3] - rangeAround[1]) / 2);
// 生成对应的随机经度坐标(默认中心点坐标 + 偏移值)
double randomLng = centerLng + differLng;
return new double[]{destRandomLat, randomLng};
}
public static void randomSet(int min, int max, int n, HashSet<Integer> set) {
if (n > (max - min + 1) || max < min) {
return;
}
for (int i = 0; i < n; i++) {
// 调用Math.random()方法
int num = (int) (Math.random() * (max - min)) + min;
set.add(num);// 将不同的数存入HashSet中
}
int setSize = set.size();
// 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小
if (setSize < n) {
randomSet(min, max, n - setSize, set);// 递归
}
}
}
package com.didichuxing.doraemonkit.kit.gpsmock
package com.didichuxing.doraemonkit.gps_mock.gpsmock
import android.content.Context
import android.os.IBinder
import android.os.IInterface
import com.didichuxing.doraemonkit.util.LogHelper
import com.didichuxing.doraemonkit.util.ReflectUtils
import java.lang.reflect.InvocationHandler
import java.lang.reflect.InvocationTargetException
......
package com.didichuxing.doraemonkit.kit.gpsmock;
package com.didichuxing.doraemonkit.gps_mock.gpsmock;
import android.annotation.SuppressLint;
import android.os.IBinder;
import android.os.IInterface;
import com.didichuxing.doraemonkit.util.LogHelper;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
......@@ -53,4 +51,4 @@ public class BinderHookHandler implements InvocationHandler {
}
return method.invoke(mBinderProxy, args);
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.gpsmock;
package com.didichuxing.doraemonkit.gps_mock.gpsmock;
public class CordTransformUtil {
static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
......
package com.didichuxing.doraemonkit.kit.gpsmock
package com.didichuxing.doraemonkit.gps_mock.gpsmock
import android.app.Activity
import android.content.Context
......@@ -39,4 +39,4 @@ class GpsMockKit : AbstractKit() {
override fun innerKitId(): String {
return "dokit_sdk_comm_ck_gps"
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.gpsmock;
package com.didichuxing.doraemonkit.gps_mock.gpsmock;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import com.didichuxing.doraemonkit.config.GpsMockConfig;
import com.didichuxing.doraemonkit.gps_mock.common.BdMapRouteData;
import com.didichuxing.doraemonkit.gps_mock.common.Utils;
import com.didichuxing.doraemonkit.model.LatLng;
import com.didichuxing.doraemonkit.util.LogHelper;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
/**
* Created by wanglikun on 2018/12/18.
......@@ -19,6 +29,13 @@ public class GpsMockManager {
private static double mLongitude = -1;
private static boolean isMocking;
private RouteMockThread mRouteMockThread;
// 待mock的路径(百度驾车路线)
private BdMapRouteData mBdMockDrivingRouteLine;
// 坐标点移动间隔时间
private long mIntervalTime;
/**
* 高德导航SDK 在接收到定位之后,会将定位和路线进行吸附,如果这里也进行mock会造成
......@@ -59,9 +76,9 @@ public class GpsMockManager {
public void mockLocationWithNotify(double latitude, double longitude) {
mockLocation(latitude, longitude);
mockLocationWithNotify(new LocationBuilder()
.setLatitude(latitude)
.setLongitude(longitude)
.build());
.setLatitude(latitude)
.setLongitude(longitude)
.build());
}
public void mockLocationWithNotify(Location location) {
......@@ -132,4 +149,128 @@ public class GpsMockManager {
public static void setIsFromMockProvider(boolean isFromMockProvider) {
GpsMockManager.isFromMockProvider = isFromMockProvider;
}
}
\ No newline at end of file
public boolean isMockingRoute() {
return mRouteMockThread != null && mRouteMockThread.isMocking();
}
public BdMapRouteData getBdMockDrivingRouteLine() {
return mBdMockDrivingRouteLine;
}
public void setBdMockDrivingRouteLine(BdMapRouteData bdMockDrivingRouteLine) {
mBdMockDrivingRouteLine = bdMockDrivingRouteLine;
}
public void performMock(LatLng latLng) {
if (latLng == null) return;
LogHelper.d(TAG, " performMock " + latLng.latitude + " " + latLng.longitude);
GpsMockManager.getInstance().mockLocationWithNotify(latLng.latitude, latLng.longitude);
GpsMockConfig.saveMockLocation(new LatLng(latLng.latitude, latLng.longitude));
}
public void startMockRouteLine(List<com.baidu.mapapi.model.LatLng> points, double speed) {
if (isMockingRoute()) return;
if (isMockingRoute() && mRouteMockThread.isSuspend()){
suspendRouteMock(false);
return;
}
if (points != null && points.size() > 0) {
mIntervalTime = Math.round(((double) GpsMockManager.getInstance().getBdMockDrivingRouteLine().getTotalDistance()) * 3600000 / (speed * 1000 * points.size()));
LogHelper.d(TAG, "mIntervalTime " + mIntervalTime);
mRouteMockThread = new RouteMockThread();
mRouteMockThread.setIntervalTime(mIntervalTime);
mRouteMockThread.setPoints(points);
mRouteMockThread.start();
}
}
/**
* 停止模拟.
*/
public void interruptRouteMockThread(){
if (GpsMockManager.getInstance().isMockingRoute()){
mRouteMockThread.interrupt();
}
}
/**
*
* @param suspend true: 暂停模拟; false:继续模拟
*/
public void suspendRouteMock(boolean suspend){
if (isMockingRoute()){
mRouteMockThread.notifyThread(suspend);
}
}
public void calculateDriftRoute(double radius, double progressLow, double progressHigh) {
Double orientLatDiffer = null;
BdMapRouteData bdMapRouteData = GpsMockManager.getInstance().getBdMockDrivingRouteLine();
if (bdMapRouteData != null && bdMapRouteData.getAllPoints().size() > 0) {
List<com.baidu.mapapi.model.LatLng> allPoints = bdMapRouteData.getAllPoints();
int totalPointsSize = allPoints.size();
List<com.baidu.mapapi.model.LatLng> randomDriftPoints = new ArrayList<>();
List<com.baidu.mapapi.model.LatLng> routeDriftPoints = new ArrayList<>();
List<com.baidu.mapapi.model.LatLng> rangeDriftPoints;
int startIndex = Math.round((totalPointsSize / 100.0f) * (int) progressLow);
int endIndex = Math.round((totalPointsSize / 100.0f) * (int) progressHigh);
if (endIndex >= totalPointsSize) {
endIndex = totalPointsSize - 1;
}
rangeDriftPoints = bdMapRouteData.getAllPoints().subList(startIndex, endIndex);
int rangeDriftPointsSize = rangeDriftPoints.size();
// 从漂移段里再抽稀出10%的坐标点进行随机漂移
int randomPointsSize = Math.round(rangeDriftPointsSize * 0.1f);
if (randomPointsSize > rangeDriftPointsSize) {
randomPointsSize = rangeDriftPointsSize;
}
// 获取随机坐标点的索引值
HashSet<Integer> randomIndexSet = new HashSet<>();
Utils.randomSet(0, rangeDriftPointsSize, randomPointsSize, randomIndexSet);
LogHelper.d(TAG, "randomPointsSize:" + randomPointsSize + " rangeDriftPointsSize:" + rangeDriftPointsSize + " randomIndexSet " + randomIndexSet);
for (int i = 0; i < rangeDriftPointsSize; i++) {
com.baidu.mapapi.model.LatLng point = rangeDriftPoints.get(i);
double[] rangeAround = Utils.getAround(point.latitude, point.longitude, radius);
if (randomIndexSet.contains(i)) {
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 {
randomDriftPoints.add(point);
}
// 所有点偏移量都一样,即可实现路径整体平移效果.
if (orientLatDiffer == null) {
orientLatDiffer = Utils.getOrientLatDiffer(rangeAround);
}
double[] orientLatLng = Utils.getOrientationLatLng(point.latitude, point.longitude, radius, rangeAround, orientLatDiffer);
com.baidu.mapapi.model.LatLng orientPoint = new com.baidu.mapapi.model.LatLng(orientLatLng[0], orientLatLng[1]);
routeDriftPoints.add(orientPoint);
}
List<com.baidu.mapapi.model.LatLng> start = allPoints.subList(0, startIndex);
List<com.baidu.mapapi.model.LatLng> end = allPoints.subList(endIndex, totalPointsSize);
randomDriftPoints.addAll(randomDriftPoints.size(), end);
randomDriftPoints.addAll(0, start);
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));
bdMapRouteData.setRouteDriftPoints(routeDriftPoints);
bdMapRouteData.setRouteDriftDistance(routeDriftDistance);
}
}
}
package com.didichuxing.doraemonkit.kit.gpsmock
package com.didichuxing.doraemonkit.gps_mock.gpsmock
import android.location.Location
import android.location.LocationListener
......@@ -6,8 +6,8 @@ import com.amap.api.location.AMapLocationListener
import com.amap.api.navi.AMapNaviListener
import com.baidu.location.BDAbstractLocationListener
import com.baidu.location.BDLocationListener
import com.didichuxing.doraemonkit.aop.map.*
import com.didichuxing.doraemonkit.kit.gpsmock.LocationHooker.LocationListenerProxy
import com.didichuxing.doraemonkit.gps_mock.gpsmock.LocationHooker.LocationListenerProxy
import com.didichuxing.doraemonkit.gps_mock.map.*
import com.tencent.map.geolocation.TencentLocation
import com.tencent.map.geolocation.TencentLocationListener
......@@ -24,9 +24,9 @@ object GpsMockProxyManager {
private val mBDLocationListenerProxies: MutableList<BDLocationListenerProxy?> = ArrayList()
private val mTencentLocationListenerProxies: MutableList<TencentLocationListenerProxy?> =
ArrayList()
private val mDMapLocationListenerProxies: MutableList<DMapLocationListener> = ArrayList()
private val mLocationListenerProxies: MutableList<LocationListenerProxy> = ArrayList()
private val mDMapLocationListenerProxies: MutableList<DMapLocationListener> = ArrayList()
private val mDMapNaviListenerProxies: MutableList<DMapLocationListener?> = ArrayList()
fun addAMapLocationListenerProxy(aMapLocationListenerProxy: AMapLocationListenerProxy) {
mAMapLocationListenerProxies.add(aMapLocationListenerProxy)
......@@ -56,6 +56,10 @@ object GpsMockProxyManager {
mDMapLocationListenerProxies.add(locationListenerProxy)
}
fun addDMapNaviListenerProxy( dMapNaviListener: DMapLocationListener){
mDMapNaviListenerProxies.add(dMapNaviListener)
}
fun addLocationListenerProxy(locationListenerProxy: LocationListenerProxy) {
mLocationListenerProxies.add(locationListenerProxy)
}
......@@ -240,6 +244,10 @@ object GpsMockProxyManager {
for (dMapLocationListener in mDMapLocationListenerProxies){
dMapLocationListener.onLocationChange(location)
}
for (dMapNavLocationListener in mDMapNaviListenerProxies){
dMapNavLocationListener?.onLocationChange(location)
}
}
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.gpsmock;
package com.didichuxing.doraemonkit.gps_mock.gpsmock;
import android.annotation.SuppressLint;
import android.location.Location;
......@@ -96,4 +96,4 @@ public class LocationHookHandler implements InvocationHandler {
}
return method.invoke(this.mOriginService, args);
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.gpsmock;
package com.didichuxing.doraemonkit.gps_mock.gpsmock;
import android.content.Context;
import android.location.GnssStatus;
......@@ -8,9 +8,9 @@ import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.IInterface;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
......@@ -173,6 +173,8 @@ public class LocationHooker extends BaseServiceHooker {
}
locationListener.onLocationChanged(location);
}
Log.d(TAG, "系统定位===onLocationChanged isMock=" + GpsMockManager.getInstance().isMocking() + " " + location.getLongitude() + " "+ location.getLatitude());
}
@Override
......
package com.didichuxing.doraemonkit.kit.gpsmock
package com.didichuxing.doraemonkit.gps_mock.gpsmock
import java.lang.reflect.InvocationTargetException
import java.lang.reflect.Method
......@@ -28,4 +28,4 @@ abstract class MethodHandler {
NoSuchMethodException::class
)
abstract fun onInvoke(originObject: Any, method: Method, args: Array<Any>?): Any?
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.gps_mock.gpsmock;
import android.util.Log;
import com.baidu.mapapi.model.LatLng;
import com.didichuxing.doraemonkit.util.LogHelper;
import com.didichuxing.doraemonkit.util.ThreadUtils;
import com.didichuxing.doraemonkit.util.ToastUtils;
import java.util.ArrayList;
import java.util.List;
public class RouteMockThread extends Thread {
private static final String TAG = RouteMockThread.class.getSimpleName();
private volatile boolean mIsMocking = false;
private final Object mWaitMonitor = new Object();
// 线程暂停标识
private volatile boolean mSuspend = false;
private int mIndex = 0;
List<com.baidu.mapapi.model.LatLng> mPoints = new ArrayList<>();
// 坐标点移动间隔时间
private long mIntervalTime;
@Override
public void run() {
while (mPoints != null && mPoints.size() > 0 && mIndex < mPoints.size()) {
mIsMocking = true;
com.baidu.mapapi.model.LatLng latLng = mPoints.get(mIndex);
LogHelper.d(TAG, "模拟导航=== step index: " + mIndex + " total steps " + mPoints.size() + " latitude " + latLng.latitude + " longitude " + latLng.longitude + " mIntervalTime " + mIntervalTime);
ThreadUtils.runOnUiThread(() -> GpsMockManager.getInstance().performMock(new com.didichuxing.doraemonkit.model.LatLng(latLng.latitude, latLng.longitude)));
mIndex++;
synchronized (mWaitMonitor) {
try {
if (mSuspend){
ToastUtils.showShort("暂停模拟");
// 暂停
mWaitMonitor.wait();
ToastUtils.showShort("继续模拟");
}else {
// 延时
mWaitMonitor.wait(mIntervalTime);
}
}catch (Exception e){
reset();
LogHelper.d(TAG, "route mock thread wait error " + mSuspend + " " + e.getMessage());
break;
}
}
}
LogHelper.d(TAG, "模拟线程===");
reset();
}
private void reset() {
mIndex = 0;
mIsMocking = false;
ToastUtils.showShort("轨迹模拟已结束");
}
/**
*
* @param suspend true: 暂停模拟; false:继续模拟.
*/
public void notifyThread(boolean suspend) {
if (!suspend) {
synchronized (mWaitMonitor) {
mWaitMonitor.notifyAll();
}
}
this.mSuspend = suspend;
}
public boolean isSuspend() {
return this.mSuspend;
}
public boolean isMocking() {
return mIsMocking;
}
public void setMocking(boolean mocking) {
mIsMocking = mocking;
}
public List<LatLng> getPoints() {
return mPoints;
}
public void setPoints(List<LatLng> points) {
mPoints.clear();
mPoints.addAll(points);
}
public long getIntervalTime() {
return mIntervalTime;
}
public void setIntervalTime(long intervalTime) {
mIntervalTime = intervalTime;
}
}
package com.didichuxing.doraemonkit.kit.gpsmock
package com.didichuxing.doraemonkit.gps_mock.gpsmock
import android.content.Context
import android.os.IBinder
import com.didichuxing.doraemonkit.kit.sysservicehook.ActivityMangerHooker
import com.didichuxing.doraemonkit.kit.sysservicehook.ActivityTaskMangerHooker
import com.didichuxing.doraemonkit.kit.sysservicehook.PackageManagerHooker
import com.didichuxing.doraemonkit.util.ReflectUtils
import java.lang.reflect.Proxy
import java.util.*
......
package com.didichuxing.doraemonkit.kit.gpsmock;
package com.didichuxing.doraemonkit.gps_mock.gpsmock;
import android.content.Context;
import android.os.IBinder;
import android.telephony.CellInfo;
import android.telephony.gsm.GsmCellLocation;
import com.didichuxing.doraemonkit.util.ReflectUtils;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
......@@ -73,4 +71,4 @@ public class TelephonyHooker extends BaseServiceHooker {
return null;
}
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.gpsmock;
package com.didichuxing.doraemonkit.gps_mock.gpsmock;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import com.didichuxing.doraemonkit.util.ReflectUtils;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
......@@ -83,4 +79,4 @@ public class WifiHooker extends BaseServiceHooker {
return method.invoke(originObject, args);
}
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.lbs.common;
package com.didichuxing.doraemonkit.gps_mock.lbs.common;
import android.content.Context;
import android.graphics.Bitmap;
......
package com.didichuxing.doraemonkit.kit.lbs.common
package com.didichuxing.doraemonkit.gps_mock.lbs.common
import com.amap.api.maps.model.LatLng
import com.amap.api.navi.model.NaviLatLng
......@@ -27,4 +27,4 @@ object AMapUtil {
fun convertToLatLng(latlng: NaviLatLng): LatLng {
return LatLng(latlng.latitude, latlng.longitude)
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.lbs.common;
package com.didichuxing.doraemonkit.gps_mock.lbs.common;
import android.content.Context;
......
package com.didichuxing.doraemonkit.kit.lbs.common;
package com.didichuxing.doraemonkit.gps_mock.lbs.common;
import android.util.ArrayMap;
......
package com.didichuxing.doraemonkit.kit.lbs.manual;
package com.didichuxing.doraemonkit.gps_mock.lbs.manual;
import android.location.Location;
import com.didichuxing.doraemonkit.util.LogUtils;
import com.didichuxing.doraemonkit.kit.lbs.preset.FloatGpsPresetMockCache;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.lbs.preset.FloatGpsPresetMockCache;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
public class FloatGpsMockCache {
private static final String TAG = "FloatGpsMockCache";
......
package com.didichuxing.doraemonkit.kit.lbs.manual;
package com.didichuxing.doraemonkit.gps_mock.lbs.manual;
public final class GPSTools {
private GPSTools() {
......
package com.didichuxing.doraemonkit.kit.lbs.manual
package com.didichuxing.doraemonkit.gps_mock.lbs.manual
import android.app.Activity
import android.content.Context
......
package com.didichuxing.doraemonkit.kit.lbs.manual;
package com.didichuxing.doraemonkit.gps_mock.lbs.manual;
import android.content.ClipData;
import android.content.ClipboardManager;
......@@ -16,9 +16,9 @@ import android.widget.TextView;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.kit.core.AbsDokitView;
import com.didichuxing.doraemonkit.kit.core.DokitViewLayoutParams;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.kit.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.kit.lbs.route.FloatGpsRouteMockCache;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.gps_mock.lbs.route.FloatGpsRouteMockCache;
import com.didichuxing.doraemonkit.util.ToastUtils;
/**
......
package com.didichuxing.doraemonkit.kit.lbs.preset;
package com.didichuxing.doraemonkit.gps_mock.lbs.preset;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.didichuxing.doraemonkit.kit.lbs.common.Constants;
import com.didichuxing.doraemonkit.kit.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.gps_mock.lbs.common.Constants;
import com.didichuxing.doraemonkit.gps_mock.lbs.common.LocInfo;
public class FloatGpsPresetMockCache {
......
package com.didichuxing.doraemonkit.kit.lbs.preset;
package com.didichuxing.doraemonkit.gps_mock.lbs.preset;
import com.didichuxing.doraemonkit.kit.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.gps_mock.lbs.common.LocInfo;
import java.util.ArrayList;
......
package com.didichuxing.doraemonkit.kit.lbs.route
package com.didichuxing.doraemonkit.gps_mock.lbs.route
import android.content.Context
import android.view.Gravity
......@@ -15,8 +15,7 @@ import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.R
import com.didichuxing.doraemonkit.kit.core.AbsDokitView
import com.didichuxing.doraemonkit.kit.core.DokitViewLayoutParams
import com.didichuxing.doraemonkit.kit.core.DokitViewManager
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager
import com.didichuxing.doraemonkit.util.ConvertUtils
import com.didichuxing.doraemonkit.util.LogHelper
import kotlin.math.ceil
......@@ -157,4 +156,4 @@ class AMapRealNavMockView : AbsDokitView() {
}
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.lbs.route;
package com.didichuxing.doraemonkit.gps_mock.lbs.route;
import android.content.Context;
import android.os.Handler;
......@@ -6,9 +6,9 @@ import android.os.Looper;
import android.util.Pair;
import com.didichuxing.doraemonkit.kit.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.kit.lbs.manual.FloatGpsMockCache;
import com.didichuxing.doraemonkit.kit.lbs.preset.FloatGpsPresetMockCache;
import com.didichuxing.doraemonkit.gps_mock.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.gps_mock.lbs.manual.FloatGpsMockCache;
import com.didichuxing.doraemonkit.gps_mock.lbs.preset.FloatGpsPresetMockCache;
import java.util.List;
import java.util.Timer;
......
package com.didichuxing.doraemonkit.kit.lbs.route
package com.didichuxing.doraemonkit.gps_mock.lbs.route
/**
* Created by kuloud on 4/11/16.
......@@ -13,4 +13,4 @@ object NaviSettings {
* 位置信息获取的频率(长),单位为毫秒。
*/
const val LOCATION_UPDATE_TIME_LONG_IN_MILLIS = 3000
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.lbs.route
package com.didichuxing.doraemonkit.gps_mock.lbs.route
import android.app.Activity
import android.content.Context
......@@ -14,7 +14,7 @@ import com.google.auto.service.AutoService
/**
* Created by changzuozhen on 2021年1月22日
*/
@AutoService(AbstractKit::class)
//@AutoService(AbstractKit::class)
class RealNavMockKit : AbstractKit() {
override val name: Int
get() = R.string.dk_kit_gps_mock_route
......@@ -69,4 +69,4 @@ class RealNavMockKit : AbstractKit() {
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.aop.location;
package com.didichuxing.doraemonkit.gps_mock.location;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.util.SparseArray;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.util.ReflectUtils;
/**
......
package com.didichuxing.doraemonkit.aop.map;
package com.didichuxing.doraemonkit.gps_mock.map;
import android.location.Location;
import com.amap.api.maps.LocationSource;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.util.LogHelper;
/**
......
package com.didichuxing.doraemonkit.aop.map;
package com.didichuxing.doraemonkit.gps_mock.map;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.kit.gpsmock.LocationBuilder;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.LocationBuilder;
import com.didichuxing.doraemonkit.util.ReflectUtils;
/**
......
package com.didichuxing.doraemonkit.aop.map;
package com.didichuxing.doraemonkit.gps_mock.map;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationListener;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.util.ReflectUtils;
/**
......
package com.didichuxing.doraemonkit.aop.map;
package com.didichuxing.doraemonkit.gps_mock.map;
import android.util.Log;
import com.amap.api.navi.AMapNavi;
import com.amap.api.navi.AMapNaviListener;
import com.amap.api.navi.model.AMapCalcRouteResult;
import com.amap.api.navi.model.AMapLaneInfo;
......@@ -7,6 +10,7 @@ import com.amap.api.navi.model.AMapModelCross;
import com.amap.api.navi.model.AMapNaviCameraInfo;
import com.amap.api.navi.model.AMapNaviCross;
import com.amap.api.navi.model.AMapNaviLocation;
import com.amap.api.navi.model.AMapNaviPath;
import com.amap.api.navi.model.AMapNaviRouteNotifyData;
import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo;
import com.amap.api.navi.model.AMapServiceAreaInfo;
......@@ -14,9 +18,12 @@ import com.amap.api.navi.model.AimLessModeCongestionInfo;
import com.amap.api.navi.model.AimLessModeStat;
import com.amap.api.navi.model.NaviInfo;
import com.amap.api.navi.model.NaviLatLng;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.util.LogHelper;
import com.didichuxing.doraemonkit.DoKit;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockProxyManager;
import java.util.HashMap;
import java.util.List;
/**
* ================================================
......@@ -269,8 +276,21 @@ public class AMapNaviListenerProxy implements AMapNaviListener {
@Override
public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {
if (aMapNaviListener != null) {
aMapNaviListener.onCalculateRouteSuccess(aMapCalcRouteResult);
try {
// 获取路线数据对象
HashMap<Integer, AMapNaviPath> naviPaths = AMapNavi.getInstance(DoKit.INSTANCE.getAPPLICATION()).getNaviPaths();
Log.i(TAG, "高德导航===onCalculateRouteSuccess $naviPaths " + naviPaths + " " + aMapCalcRouteResult.toString());
// 绘制显示路径
List<NaviLatLng> coords = naviPaths.get(12).getSteps().get(0).getCoords();
for (NaviLatLng latLng : coords) {
Log.i(TAG, "高德导航===onCalculateRouteSuccess $naviPaths " + latLng.toString());
}
if (aMapNaviListener != null) {
aMapNaviListener.onCalculateRouteSuccess(aMapCalcRouteResult);
}
}catch (Exception e){
Log.e(TAG, e.getMessage());
}
}
......
package com.didichuxing.doraemonkit.aop.map;
package com.didichuxing.doraemonkit.gps_mock.map;
import android.util.Log;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockProxyManager;
/**
* ================================================
......@@ -25,6 +27,7 @@ public class BDAbsLocationListenerProxy extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
Log.d("onReceiveLocation", "BDAbsLocationListenerProxy: " + bdLocation.toString() + " mock lat" + GpsMockManager.getInstance().getLatitude() + " " + " mock lon" + GpsMockManager.getInstance().getLongitude());
if (GpsMockManager.getInstance().isMocking()) {
try {
bdLocation.setLatitude(GpsMockManager.getInstance().getLatitude());
......
package com.didichuxing.doraemonkit.aop.map;
package com.didichuxing.doraemonkit.gps_mock.map;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.util.LogHelper;
/**
* ================================================
......@@ -25,6 +26,7 @@ public class BDLocationListenerProxy implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
LogHelper.d("BDLocationListenerProxy", bdLocation.toString() + " mock lat" + GpsMockManager.getInstance().getLatitude() + " " + " mock lon" + GpsMockManager.getInstance().getLongitude());
if (GpsMockManager.getInstance().isMocking()) {
try {
bdLocation.setLatitude(GpsMockManager.getInstance().getLatitude());
......
package com.didichuxing.doraemonkit.aop.map
package com.didichuxing.doraemonkit.gps_mock.map
import android.location.Location
......@@ -9,4 +9,4 @@ import android.location.Location
interface DMapLocationListener {
fun getDMapLocation(): Any
fun onLocationChange(location: Location?)
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.aop.map;
package com.didichuxing.doraemonkit.gps_mock.map;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.util.ReflectUtils;
import com.tencent.map.geolocation.TencentLocation;
import com.tencent.map.geolocation.TencentLocationListener;
......
package com.didichuxing.doraemonkit.aop.map;
package com.didichuxing.doraemonkit.gps_mock.map;
import android.location.LocationListener;
......@@ -6,7 +6,7 @@ import com.amap.api.location.AMapLocationListener;
import com.amap.api.navi.AMapNaviListener;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocationListener;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockProxyManager;
import com.tencent.map.geolocation.TencentLocationListener;
/**
......
package com.didichuxing.doraemonkit.kit.sysservicehook
package com.didichuxing.doraemonkit.gps_mock.sysservicehook
import android.app.ActivityManager
import android.content.Context
import android.os.Build
import android.os.IBinder
import android.os.IInterface
import com.didichuxing.doraemonkit.kit.gpsmock.BaseServiceHooker
import com.didichuxing.doraemonkit.kit.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.gps_mock.gpsmock.BaseServiceHooker
import com.didichuxing.doraemonkit.gps_mock.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.util.ReflectUtils
/**
......@@ -95,4 +95,4 @@ class ActivityMangerHooker : BaseServiceHooker() {
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.sysservicehook
package com.didichuxing.doraemonkit.gps_mock.sysservicehook
import android.content.Context
import android.os.Build
import android.os.IBinder
import android.os.IInterface
import com.didichuxing.doraemonkit.kit.gpsmock.BaseServiceHooker
import com.didichuxing.doraemonkit.kit.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.gps_mock.gpsmock.BaseServiceHooker
import com.didichuxing.doraemonkit.gps_mock.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.util.ReflectUtils
/**
......@@ -61,4 +61,4 @@ class ActivityTaskMangerHooker : BaseServiceHooker() {
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.sysservicehook
package com.didichuxing.doraemonkit.gps_mock.sysservicehook
import com.didichuxing.doraemonkit.kit.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.gps_mock.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.util.LogHelper
import java.lang.reflect.Method
......@@ -22,4 +22,4 @@ class GetInstalledApplicationsMethodHandler : MethodHandler() {
method.invoke(originObject, *args)
}
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.sysservicehook
package com.didichuxing.doraemonkit.gps_mock.sysservicehook
import android.content.Context
import android.os.Build
import android.os.IBinder
import android.os.IInterface
import com.didichuxing.doraemonkit.kit.gpsmock.BaseServiceHooker
import com.didichuxing.doraemonkit.kit.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.gps_mock.gpsmock.BaseServiceHooker
import com.didichuxing.doraemonkit.gps_mock.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.util.ReflectUtils
/**
......@@ -55,4 +54,4 @@ class PackageManagerHooker : BaseServiceHooker() {
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.kit.sysservicehook
package com.didichuxing.doraemonkit.gps_mock.sysservicehook
import com.didichuxing.doraemonkit.kit.gpsmock.MethodHandler
import com.didichuxing.doraemonkit.util.LogHelper
import com.didichuxing.doraemonkit.gps_mock.gpsmock.MethodHandler
import java.lang.reflect.Method
/**
......@@ -22,4 +21,4 @@ class StartActivityMethodHandler : MethodHandler() {
method.invoke(originObject, *args)
}
}
}
\ No newline at end of file
}
package com.didichuxing.doraemonkit.gps_mock.widget;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import com.didichuxing.doraemonkit.gps_mock.R;
public class CustomDialogFragment extends DialogFragment {
private IDialogHelper mDialogHelper;
public CustomDialogFragment(int contentLayoutId, IDialogHelper dialogHelper) {
super(contentLayoutId);
this.mDialogHelper = dialogHelper;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, R.style.Dialog_FullScreen);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mDialogHelper.init(view);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
package com.didichuxing.doraemonkit.gps_mock.widget;
import android.util.Log;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.route.DrivingRouteLine;
import com.didichuxing.doraemonkit.gps_mock.R;
import com.didichuxing.doraemonkit.gps_mock.common.BdMapRouteData;
import com.didichuxing.doraemonkit.util.LogHelper;
import java.util.ArrayList;
import java.util.List;
/**
* 用于显示一条驾车路线的overlay,自3.4.0版本起可实例化多个添加在地图中显示,当数据中包含路况数据时,则默认使用路况纹理分段绘制
*/
public class DrivingRouteOverlay extends OverlayManager {
private DrivingRouteLine mRouteLine = null;
private BdMapRouteData mBdMapRouteData;
boolean focus = false;
/**
* 构造函数
*
* @param baiduMap 该DrivingRouteOvelray引用的 BaiduMap
*/
public DrivingRouteOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
// @Override
// public final List<OverlayOptions> getOverlayOptions() {
// if (mRouteLine == null) {
// return null;
// }
//
// List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
// // step node
// if (mRouteLine.getAllStep() != null
// && mRouteLine.getAllStep().size() > 0) {
//
// for (DrivingStep step : mRouteLine.getAllStep()) {
// Bundle b = new Bundle();
// b.putInt("index", mRouteLine.getAllStep().indexOf(step));
// if (step.getEntrance() != null) {
// overlayOptionses.add((new MarkerOptions())
// .position(step.getEntrance().getLocation())
// .anchor(0.5f, 0.5f)
// .zIndex(10)
// .rotate((360 - step.getDirection()))
// .extraInfo(b)
// .icon(BitmapDescriptorFactory
// .fromAssetWithDpi("Icon_line_node.png")));
// }
// // 最后路段绘制出口点
// if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine
// .getAllStep().size() - 1) && step.getExit() != null) {
// overlayOptionses.add((new MarkerOptions())
// .position(step.getExit().getLocation())
// .anchor(0.5f, 0.5f)
// .zIndex(10)
// .icon(BitmapDescriptorFactory
// .fromAssetWithDpi("Icon_line_node.png")));
//
// }
// }
// }
//
// if (mRouteLine.getStarting() != null) {
// overlayOptionses.add((new MarkerOptions())
// .position(mRouteLine.getStarting().getLocation())
// .icon(getStartMarker() != null ? getStartMarker() :
// BitmapDescriptorFactory
// .fromAssetWithDpi("Icon_start.png")).zIndex(10));
// }
// if (mRouteLine.getTerminal() != null) {
// overlayOptionses
// .add((new MarkerOptions())
// .position(mRouteLine.getTerminal().getLocation())
// .icon(getTerminalMarker() != null ? getTerminalMarker() :
// BitmapDescriptorFactory
// .fromAssetWithDpi("Icon_end.png"))
// .zIndex(10));
// }
// // poly line
// if (mRouteLine.getAllStep() != null
// && mRouteLine.getAllStep().size() > 0) {
//
// List<DrivingStep> steps = mRouteLine.getAllStep();
// int stepNum = steps.size();
//
//
// List<LatLng> points = new ArrayList<LatLng>();
// ArrayList<Integer> traffics = new ArrayList<Integer>();
// int totalTraffic = 0;
// for (int i = 0; i < stepNum; i++) {
// if (i == stepNum - 1) {
// points.addAll(steps.get(i).getWayPoints());
// } else {
// // points.addAll(steps.get(i).getWayPoints().subList(0, steps.get(i).getWayPoints().size() - 1));
// LogHelper.d("路径坐标DrivingRouteOverlay", "i " + i + " " + steps.get(i).getWayPoints());
// points.addAll(steps.get(i).getWayPoints());
// }
//
// totalTraffic += steps.get(i).getWayPoints().size() - 1;
// if (steps.get(i).getTrafficList() != null && steps.get(i).getTrafficList().length > 0) {
// for (int j = 0; j < steps.get(i).getTrafficList().length; j++) {
// traffics.add(steps.get(i).getTrafficList()[j]);
// }
// }
// }
//
// // Bundle indexList = new Bundle();
// // if (traffics.size() > 0) {
// // int raffic[] = new int[traffics.size()];
// // int index = 0;
// // for (Integer tempTraff : traffics) {
// // raffic[index] = tempTraff.intValue();
// // index++;
// // }
// // indexList.putIntArray("indexs", raffic);
// // }
// boolean isDotLine = false;
//
// if (traffics != null && traffics.size() > 0) {
// isDotLine = true;
// }
// PolylineOptions option = new PolylineOptions().points(points).textureIndex(traffics)
// .width(7).dottedLine(isDotLine).focus(true)
// .color(getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255)).zIndex(0);
// if (isDotLine) {
// option.customTextureList(getCustomTextureList());
// }
// overlayOptionses.add(option);
// }
// return overlayOptionses;
// }
@Override
public final List<OverlayOptions> getOverlayOptions() {
if (mBdMapRouteData == null) {
return null;
}
List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
// step node
// if (mRouteLine.getAllStep() != null
// && mRouteLine.getAllStep().size() > 0) {
//
// for (DrivingStep step : mRouteLine.getAllStep()) {
// Bundle b = new Bundle();
// b.putInt("index", mRouteLine.getAllStep().indexOf(step));
// if (step.getEntrance() != null) {
// overlayOptionses.add((new MarkerOptions())
// .position(step.getEntrance().getLocation())
// .anchor(0.5f, 0.5f)
// .zIndex(10)
// .rotate((360 - step.getDirection()))
// .extraInfo(b)
// .icon(BitmapDescriptorFactory
// .fromAssetWithDpi("Icon_line_node.png")));
// }
// // 最后路段绘制出口点
// if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine
// .getAllStep().size() - 1) && step.getExit() != null) {
// overlayOptionses.add((new MarkerOptions())
// .position(step.getExit().getLocation())
// .anchor(0.5f, 0.5f)
// .zIndex(10)
// .icon(BitmapDescriptorFactory
// .fromAssetWithDpi("Icon_line_node.png")));
//
// }
// }
// }
if (mBdMapRouteData.getStartNode() != null) {
overlayOptionses.add((new MarkerOptions())
.position(mBdMapRouteData.getStartNode().getLocation())
.icon(getStartMarker() != null ? getStartMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_start.png")).zIndex(10));
}
if (mBdMapRouteData.getTerminalNode() != null) {
overlayOptionses
.add((new MarkerOptions())
.position(mBdMapRouteData.getTerminalNode().getLocation())
.icon(getTerminalMarker() != null ? getTerminalMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_end.png"))
.zIndex(10));
}
// poly line
if (mBdMapRouteData.getAllPoints() != null && mBdMapRouteData.getAllPoints().size() > 0) {
// List<DrivingStep> steps = mRouteLine.getAllStep();
// int stepNum = steps.size();
// List<LatLng> points = new ArrayList<LatLng>();
// ArrayList<Integer> traffics = new ArrayList<Integer>();
// int totalTraffic = 0;
// for (int i = 0; i < stepNum; i++) {
// if (i == stepNum - 1) {
// points.addAll(steps.get(i).getWayPoints());
// } else {
// // points.addAll(steps.get(i).getWayPoints().subList(0, steps.get(i).getWayPoints().size() - 1));
// LogHelper.d("路径坐标DrivingRouteOverlay", "i " + i + " " + steps.get(i).getWayPoints());
// points.addAll(steps.get(i).getWayPoints());
// }
//
// totalTraffic += steps.get(i).getWayPoints().size() - 1;
// if (steps.get(i).getTrafficList() != null && steps.get(i).getTrafficList().length > 0) {
// for (int j = 0; j < steps.get(i).getTrafficList().length; j++) {
// traffics.add(steps.get(i).getTrafficList()[j]);
// }
// }
// }
// Bundle indexList = new Bundle();
// if (traffics.size() > 0) {
// int raffic[] = new int[traffics.size()];
// int index = 0;
// for (Integer tempTraff : traffics) {
// raffic[index] = tempTraff.intValue();
// index++;
// }
// indexList.putIntArray("indexs", raffic);
// }
// boolean isDotLine = false;
// if (traffics != null && traffics.size() > 0) {
// isDotLine = true;
// }
// PolylineOptions option = new PolylineOptions().points(mBdMapRouteData.getAllPoints())
// .width(7).dottedLine(isDotLine).focus(true)
// .color(getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255)).zIndex(0);
// if (isDotLine) {
// option.customTextureList(getCustomTextureList());
// }
overlayOptionses.add(getPolylineOptions(mBdMapRouteData.getAllPoints(), COLOR_ROUTE));
}
return overlayOptionses;
}
@Override
public PolylineOptions getPolylineOptions(List<LatLng> points, int lineColor){
return new PolylineOptions().points(points)
.width(10).focus(true)
.color(getLineColor() != 0 ? getLineColor() : lineColor).zIndex(0);
}
/**
* 设置路线数据
*
* @param routeLine 路线数据
*/
public void setData(DrivingRouteLine routeLine) {
this.mRouteLine = routeLine;
}
public void setBdMapRouteData(BdMapRouteData bdMapRouteData){
this.mBdMapRouteData = bdMapRouteData;
}
/**
* 覆写此方法以改变默认起点图标
*
* @return 起点图标
*/
public BitmapDescriptor getStartMarker() {
return BitmapDescriptorFactory.fromResourceWithDpi(R.mipmap.dk_icon_route_start, 0);
}
/**
* 覆写此方法以改变默认绘制颜色
*
* @return 线颜色
*/
public int getLineColor() {
return 0;
}
public List<BitmapDescriptor> getCustomTextureList() {
ArrayList<BitmapDescriptor> list = new ArrayList<BitmapDescriptor>();
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_blue_arrow.png"));
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_green_arrow.png"));
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_yellow_arrow.png"));
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_red_arrow.png"));
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_nofocus.png"));
return list;
}
/**
* 覆写此方法以改变默认终点图标
*
* @return 终点图标
*/
public BitmapDescriptor getTerminalMarker() {
return BitmapDescriptorFactory.fromResourceWithDpi(R.mipmap.dk_icon_route_end, 0);
}
/**
* 覆写此方法以改变默认点击处理
*
* @param i 线路节点的 index
* @return 是否处理了该点击事件
*/
public boolean onRouteNodeClick(int i) {
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().get(i) != null) {
LogHelper.i("baidumapsdk", "DrivingRouteOverlay onRouteNodeClick");
}
return false;
}
@Override
public final boolean onMarkerClick(Marker marker) {
for (Overlay mMarker : mOverlayList) {
if (mMarker instanceof Marker && mMarker.equals(marker)) {
if (marker.getExtraInfo() != null) {
onRouteNodeClick(marker.getExtraInfo().getInt("index"));
}
}
}
return true;
}
@Override
public boolean onPolylineClick(Polyline polyline) {
boolean flag = false;
for (Overlay mPolyline : mOverlayList) {
if (mPolyline instanceof Polyline && mPolyline.equals(polyline)) {
// 选中
flag = true;
break;
}
}
setFocus(flag);
return true;
}
public void setFocus(boolean flag) {
focus = flag;
for (Overlay mPolyline : mOverlayList) {
if (mPolyline instanceof Polyline) {
// 选中
((Polyline) mPolyline).setFocus(flag);
break;
}
}
}
}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册