Skip to content

Commit

Permalink
feat(Android):增加心跳丢失模拟功能.
Browse files Browse the repository at this point in the history
  • Loading branch information
HeyCFarmer committed Sep 7, 2022
1 parent a8efcdf commit 707523f
Show file tree
Hide file tree
Showing 14 changed files with 292 additions and 47 deletions.
4 changes: 2 additions & 2 deletions Android/config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,18 @@ public class BdMapRouteData {

List<com.baidu.mapapi.model.LatLng> mRandomDriftPoints = new ArrayList<>();
List<com.baidu.mapapi.model.LatLng> mRouteDriftPoints = new ArrayList<>();
List<com.baidu.mapapi.model.LatLng> 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<LatLng> getAllPoints() {
return mAllPoints;
}
Expand Down Expand Up @@ -73,6 +81,16 @@ public void setRouteDriftPoints(List<LatLng> routeDriftPoints) {
mRouteDriftPoints.addAll(routeDriftPoints);
}


public List<LatLng> getOriginRouteLostLocPoints() {
return mRouteLostLocPoints;
}

public void setOriginRouteLostLocPoints(List<LatLng> routeLostLocPoints) {
mRouteLostLocPoints.clear();
mRouteLostLocPoints.addAll(routeLostLocPoints);
}

public boolean isRouteDataFromBiz() {
return mRouteDataFromBiz;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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()));
Expand All @@ -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()));
}
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 {
// 计算漂移点(智能模式)待补齐.

Expand All @@ -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);
}
Expand All @@ -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);
}
}

Expand Down Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ public void performMock(LatLng latLng) {
public void startMockRouteLine(List<com.baidu.mapapi.model.LatLng> points, double speed, RouteMockThread.RouteMockStatusCallback statusCallback) {
if (isMockingRoute()) return;

if (isMockingRoute() && mRouteMockThread.isSuspend()){
if (isMockingRoute() && mRouteMockThread.isSuspend()) {
suspendRouteMock(false);
return;
}
Expand All @@ -189,37 +189,101 @@ public void startMockRouteLine(List<com.baidu.mapapi.model.LatLng> 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();
}
}

/**
* 停止模拟.
*/
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<com.baidu.mapapi.model.LatLng> 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<com.baidu.mapapi.model.LatLng> 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<com.baidu.mapapi.model.LatLng> randomDriftPoints = bdMapRouteData.getRandomDriftPoints();
List<com.baidu.mapapi.model.LatLng> 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<com.baidu.mapapi.model.LatLng> tempLostLocRandomDriftPoints = new ArrayList<>();
tempLostLocRandomDriftPoints.addAll(randomDriftPoints.subList(0, startIndex));
tempLostLocRandomDriftPoints.addAll(randomDriftPoints.subList(endIndex, totalPointsSize));
bdMapRouteData.setRandomDriftPoints(tempLostLocRandomDriftPoints);
List<com.baidu.mapapi.model.LatLng> 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();
Expand Down Expand Up @@ -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);
}

Expand All @@ -275,13 +339,13 @@ public void calculateDriftRoute(double radius, double progressLow, double progre
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));
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
public class DrivingRouteOverlay extends OverlayManager {

private DrivingRouteLine mRouteLine = null;
private BdMapRouteData mBdMapRouteData;
boolean focus = false;

/**
Expand Down
Loading

0 comments on commit 707523f

Please sign in to comment.