Merge branch 'dev_robotaxi-d-app-module_280_220608_2.8.0' of gitlab.zhidaoauto.com:zhjt/AndroidApp/MoGoEagleEye into dev_robotaxi-d-app-module_280_220608_2.8.0

This commit is contained in:
wangmingjun
2022-06-21 21:39:14 +08:00
29 changed files with 1222 additions and 289 deletions

View File

@@ -288,7 +288,6 @@ public class BusFragment extends BaseBusTabFragment<BusFragment, BusPresenter>
// 出车的时候重制站点状态
mPresenter.queryBusRoutes();
tvOperationStatus.setText("收车");
showSlidePanle("滑动出发");
showPanel();
} else {
AIAssist.getInstance(getContext()).speakTTSVoice("已收车");

View File

@@ -102,7 +102,6 @@ public class MoGoHandAdasMsgManager implements
public void onAutopilotBrakeLightData(boolean brakeLight) {
}
@Override
public void onAutopilotCarConfig(@NotNull MessagePad.CarConfigResp carConfigResp) {
if (carConfigResp != null && !TextUtils.isEmpty(carConfigResp.getMacAddress())) {

View File

@@ -0,0 +1,29 @@
package com.mogo.eagle.core.function.appupgrade.network;
import com.mogo.eagle.core.data.bindingcar.BindingcarInfo;
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo;
import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
/**
* @author lixiaopeng
* @description 绑定车辆
* @since: 6/20/22
*/
public interface UpgradeApiService {
/**
* 获取升级信息
*
* @return {@link UpgradeAppInfo}
*/
@Headers("Content-Type:application/json;charset=UTF-8")
@POST("pad/selectPadByMac")
Observable<UpgradeAppInfo> getUpgradeInfo(@Body RequestBody requestBody);
}

View File

@@ -0,0 +1,104 @@
package com.mogo.eagle.core.function.appupgrade.network;
import android.content.Context;
import android.util.Log;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.constants.SharedPrefsConstants;
import com.mogo.eagle.core.data.bindingcar.BindingcarInfo;
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo;
import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo;
import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack;
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
import com.mogo.eagle.core.utilcode.util.AppUtils;
import com.mogo.eagle.core.utilcode.util.GsonUtils;
import com.mogo.module.common.constants.HostConst;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
import okhttp3.RequestBody;
/**
* @author lixiaopeng
* @description 获取升级信息
* @since: 3/25/22
*/
public class UpgradeAppNetWorkManager {
private static volatile UpgradeAppNetWorkManager requestNoticeManager;
private final UpgradeApiService mUpgradeApiService;
private static final String TAG = "UpgradeAppNetWorkManager";
private UpgradeAppNetWorkManager() {
mUpgradeApiService = MoGoRetrofitFactory.getInstance(HostConst.UPGRADE_APP_HOST)
.create(UpgradeApiService.class);
}
public static UpgradeAppNetWorkManager getInstance() {
if (requestNoticeManager == null) {
synchronized (UpgradeAppNetWorkManager.class) {
if (requestNoticeManager == null) {
requestNoticeManager = new UpgradeAppNetWorkManager();
}
}
}
return requestNoticeManager;
}
/**
* 获取app升级信息
*/
public void getAppUpgradeInfo(Context context, int screenType) {
String sn = "X20202203105S688HZ";
String versionCode = "2070000";
String versionName = "2.7.0";
int screenType1 = 1;
// String sn = MoGoAiCloudClientConfig.getInstance().getSn();
// String versionCode = AppUtils.getAppVersionCode();
// String versionName = AppUtils.getAppVersionName();
UpgradeAppRequest request = new UpgradeAppRequest("apps_control", sn, versionCode, versionName, screenType1);
RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request));
mUpgradeApiService.getUpgradeInfo(requestBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<UpgradeAppInfo>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.d("liyz", "UpgradeAppInfo ------> ");
}
@Override
public void onNext(@NonNull UpgradeAppInfo info) {
if (info != null && info.getData() != null) {
Log.d("liyz", "UpgradeAppInfo url = " + info.getData().getApp_url() + "----code = " + info.getData().getVersion_code());
//TODO 弹框
}
}
@Override
public void onError(@NonNull Throwable e) {
CallerLogger.INSTANCE.e(TAG, "getBindingcarInfo onError e = " + e.toString() + "---e.getMessage = " + e.getMessage());
Log.e("liyz", "UpgradeAppInfo onError e = " + e.toString() + "---e.getMessage = " + e.getMessage());
}
@Override
public void onComplete() {
}
});
}
}

View File

@@ -0,0 +1,72 @@
package com.mogo.eagle.core.function.appupgrade.network;
/**
* @author lixiaopeng
* @description 获取app升级信息
* @since: 11/15/21
*/
public class UpgradeAppRequest {
private String resources;
private String sn;
private String version_code;
private String version_name;
private int screen_type;
public UpgradeAppRequest(String resources, String sn, String versionCode, String versionName, int type) {
this.resources = resources;
this.sn = sn;
this.version_code = versionCode;
this.version_name = versionName;
this.screen_type = type;
}
public String getResources() {
return resources;
}
public void setResources(String resources) {
this.resources = resources;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getVersion_code() {
return version_code;
}
public void setVersion_code(String version_code) {
this.version_code = version_code;
}
public String getVersion_name() {
return version_name;
}
public void setVersion_name(String version_name) {
this.version_name = version_name;
}
public int getScreen_type() {
return screen_type;
}
public void setScreen_type(int screen_type) {
this.screen_type = screen_type;
}
@Override
public String toString() {
return "UpgradeAppRequest{" +
"sn='" + sn + '\'' +
", version_code='" + version_code + '\'' +
", version_name='" + version_name + '\'' +
", screen_type=" + screen_type +
'}';
}
}

View File

@@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.config.HmiBuildConfig;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack;
import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingcarProvider;
import com.mogo.eagle.core.function.appupgrade.network.UpgradeAppNetWorkManager;
import com.mogo.eagle.core.function.bindingcar.network.BindingcarNetWorkManager;
import com.mogo.eagle.core.function.ipcupgrade.IPCUpgradeManager;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
@@ -127,5 +128,12 @@ public class BindingcarProvider implements IMoGoBindingcarProvider {
return screenType;
}
/**
* 查询app是否需要升级
*/
@Override
public void queryAppUpgrade() {
UpgradeAppNetWorkManager.getInstance().getAppUpgradeInfo(mContext, getScreenType());
}
}

View File

@@ -46,6 +46,7 @@ import com.mogo.eagle.core.function.hmi.notification.WarningFloat
import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator
import com.mogo.eagle.core.function.hmi.ui.bindingcar.ModifyBindingCarDialog
import com.mogo.eagle.core.function.hmi.ui.bindingcar.ToBindingCarDialog
import com.mogo.eagle.core.function.hmi.ui.bindingcar.UpgradeAppDialog
import com.mogo.eagle.core.function.hmi.ui.camera.CameraListView
import com.mogo.eagle.core.function.hmi.ui.notice.NoticeBannerView
import com.mogo.eagle.core.function.hmi.ui.notice.NoticeNormalBannerView
@@ -965,6 +966,7 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
private var modifyBindingCarDialog: ModifyBindingCarDialog? = null
private var toBindingCarDialog: ToBindingCarDialog? = null
private var upgradeAppDialog: UpgradeAppDialog? = null
override fun showToBindingcarDialog() {
if (toBindingCarDialog == null) {
@@ -978,7 +980,16 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
modifyBindingCarDialog = ModifyBindingCarDialog(requireContext())
}
modifyBindingCarDialog!!.showModifyBindingcarDialog()
}
/**
* 升级app弹框
*/
override fun showUpgradeDialog(name: String, url: String) {
if (upgradeAppDialog == null) {
upgradeAppDialog = UpgradeAppDialog(requireContext())
}
upgradeAppDialog!!.showUpgradeAppDialog(name, url)
}
/**

View File

@@ -0,0 +1,75 @@
package com.mogo.eagle.core.function.hmi.ui.bindingcar
import android.content.Context
import android.util.Log
import android.widget.TextView
import androidx.lifecycle.LifecycleObserver
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.module.common.dialog.BaseFloatDialog
import com.mogo.service.IMogoServiceApis
import com.mogo.service.statusmanager.IMogoStatusChangedListener
import com.mogo.service.statusmanager.StatusDescriptor
/**
* @brief APP升级提示弹框
* @author lixiaopeng
*/
class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver{
private val TAG = "UpgradeAppDialog"
private var confirmTv: TextView? = null
private var cancleTv: TextView? = null
private var tag: String? = null
private var downloarUrl: String? = null
private var mServiceApis: IMogoServiceApis? = null
private val statusChangedListenerForCheckNotice = IMogoStatusChangedListener { descriptor, isTrue ->
if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND) {
dismiss()
}
}
init {
setContentView(R.layout.dialog_upgrade_app)
setCanceledOnTouchOutside(true)
confirmTv = findViewById(R.id.tv_upgrade_confirm)
cancleTv = findViewById(R.id.tv_upgrade_cancel)
confirmTv?.setOnClickListener {
downloadApp()
}
cancleTv?.setOnClickListener {
dismiss()
}
}
/**
* 去下载 TODO 成功或者失败
*/
fun downloadApp() {
tag?.let { downloarUrl?.let { it1 -> CallerDevaToolsManager.downLoadPackage(it, it1) } }
dismiss()
}
override fun dismiss() {
super.dismiss()
}
fun showUpgradeAppDialog(name: String, url: String) {
if (isShowing) {
return
}
tag = name
downloarUrl = url
Log.d("liyz", "tag = $tag ---- downloarUrl = $downloarUrl")
show()
}
}

View File

@@ -64,6 +64,8 @@ import com.mogo.eagle.core.utilcode.util.*
import com.mogo.map.MogoMap
import com.mogo.map.uicontroller.VisualAngleMode
import com.mogo.map.uicontroller.VisualAngleMode.*
import com.mogo.module.service.routeoverlay.*
import com.tencent.liteav.basic.datareport.a.B
import com.zhidao.easysocket.utils.L
import kotlinx.android.synthetic.main.view_debug_setting.view.*
import mogo.telematics.pad.MessagePad
@@ -965,6 +967,16 @@ class DebugSettingView @JvmOverloads constructor(
accelerationIsShow = isChecked
}
tbRouteDynamicEffect.isChecked = AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)
tbRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
RouteStrategy.enable(true)
} else {
RouteStrategy.enable(false)
}
}
btnThresholdDefine.setOnClickListener {
try {
accelerationThresholdNum = etThreshold.text.toString().toDouble()

View File

@@ -5,16 +5,19 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingCarListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingCarListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.AppUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
@@ -58,7 +61,13 @@ class SystemVersionView @JvmOverloads constructor(
//鹰眼版本视图点击事件
ivPadVersion.setOnClickListener {
CallerLogger.i("$M_HMI$$TAG", "pad version view clicked")
// CallerBindingcarManager.getBindingcarProvider().queryAppUpgrade()
Logger.d("liyz", "ivPadVersion --click ")
}
//工控机版本视图点击事件
ivAdVersion.setOnClickListener {
CallerLogger.i("$M_HMI$$TAG", "ad version view clicked")

View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="840px"
android:layout_height="470px"
android:background="@color/dialog_bg_color"
app:roundLayoutRadius="32px">
<TextView
android:id="@+id/tv_upgrade_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50px"
android:text="@string/application_upgrade"
android:textColor="#FFFFFFFF"
android:textSize="56px"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_upgrade_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50px"
android:text="@string/application_upgrade_confirm"
android:textColor="#FFFFFFFF"
android:textSize="43px"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_bindingcar_title" />
<View
android:id="@+id/view_horizontal_line"
android:layout_width="match_parent"
android:layout_height="2px"
android:layout_marginTop="80px"
android:background="#66B8BFE8"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_bindingcar_tips" />
<View
android:id="@+id/view_vertical_line"
android:layout_width="3px"
android:layout_height="0dp"
android:background="#66B8BFE8"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_line" />
<TextView
android:id="@+id/tv_upgrade_confirm"
android:layout_width="400px"
android:layout_height="100px"
android:gravity="center"
android:text="@string/confirm"
android:textColor="#FFFFFFFF"
android:textSize="46px"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/view_vertical_line"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_line" />
<TextView
android:id="@+id/tv_upgrade_cancel"
android:layout_width="400px"
android:layout_height="100px"
android:gravity="center"
android:text="@string/cancel"
android:textColor="#FFFFFFFF"
android:textSize="46px"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/view_vertical_line"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_line" />
</com.mogo.eagle.core.widget.RoundConstraintLayout>

View File

@@ -1257,6 +1257,17 @@
android:textOn="关闭「加速度面板」"
android:textSize="@dimen/dp_24" />
<ToggleButton
android:id="@+id/tbRouteDynamicEffect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:layout_margin="2dp"
android:gravity="center"
android:textOff="开启「引导线动态效果」"
android:textOn="关闭「引导线动态效果」"
android:textSize="@dimen/dp_24" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etThreshold"
android:layout_width="wrap_content"

View File

@@ -166,13 +166,17 @@ public class SmallMapDirectionView
if (location == null) {
return;
}
if (mCarMarker == null){
mCarMarker = mAMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.module_small_map_view_my_location_logo))
.anchor(0.5f, 0.5f));
}
if(mCarMarker == null){
return;
}
LatLng currentLatLng = new LatLng(location.getLatitude(), location.getLongitude());
//更新车辆位置
if (mCarMarker != null) {
// mCarMarker.setRotateAngle(location.getBearing());
mCarMarker.setPosition(currentLatLng);
// mCarMarker.setToTop();
}
mCarMarker.setPosition(currentLatLng);
CameraPosition cameraPosition;
if (mCoordinatesLatLng.size() > 1) {

View File

@@ -466,7 +466,6 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
l3.location = V2XMarkerLocation().also { l4 ->
l4.lat = this.roadwork?.center?.point?.lat ?: 0.0
l4.lon = this.roadwork?.center?.point?.lon ?: 0.0
l4.angle = -1.0
}
})
}

View File

@@ -48,7 +48,7 @@ public class V2XAlarmServer {
// 因为集合是按照距离排序后的所以这里检索出来第一个就发出警告
for (V2XRoadEventEntity v2XRoadEventEntity : v2XRoadEventEntityList) {
// 0、道路事件必须有朝向角度>=0;
boolean ignoreAngle = v2XRoadEventEntity.getLocation().getAngle() < 0;
boolean ignoreAngle = EventTypeEnum.AI_ROAD_WORK.getPoiType().equals(v2XRoadEventEntity.getPoiType());
if (v2XRoadEventEntity.getLocation().getAngle() >= 0 || ignoreAngle) {
// 计算车辆距离指定气泡的距离
MarkerLocation eventLocation = v2XRoadEventEntity.getLocation();

View File

@@ -0,0 +1,137 @@
package com.mogo.eagle.core.data.bindingcar;
import java.io.Serializable;
/**
* @author lixiaopeng
* @description
* @since 6/21/22
*/
public class AppInfo implements Serializable {
private IdInfo _id;
private String bk_inst_id;
private String bk_inst_name;
private String bk_supplier_account;
private int screen_type; //1司机屏2乘客屏
private String sn;
private long last_time;
private String app_url;
private String bk_obj_id;
private String version_code;
private String version_name;
private long create_time;
public IdInfo get_id() {
return _id;
}
public void set_id(IdInfo _id) {
this._id = _id;
}
public String getBk_inst_id() {
return bk_inst_id;
}
public void setBk_inst_id(String bk_inst_id) {
this.bk_inst_id = bk_inst_id;
}
public String getBk_inst_name() {
return bk_inst_name;
}
public void setBk_inst_name(String bk_inst_name) {
this.bk_inst_name = bk_inst_name;
}
public String getBk_supplier_account() {
return bk_supplier_account;
}
public void setBk_supplier_account(String bk_supplier_account) {
this.bk_supplier_account = bk_supplier_account;
}
public int getScreen_type() {
return screen_type;
}
public void setScreen_type(int screen_type) {
this.screen_type = screen_type;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public long getLast_time() {
return last_time;
}
public void setLast_time(long last_time) {
this.last_time = last_time;
}
public String getApp_url() {
return app_url;
}
public void setApp_url(String app_url) {
this.app_url = app_url;
}
public String getBk_obj_id() {
return bk_obj_id;
}
public void setBk_obj_id(String bk_obj_id) {
this.bk_obj_id = bk_obj_id;
}
public String getVersion_code() {
return version_code;
}
public void setVersion_code(String version_code) {
this.version_code = version_code;
}
public String getVersion_name() {
return version_name;
}
public void setVersion_name(String version_name) {
this.version_name = version_name;
}
public long getCreate_time() {
return create_time;
}
public void setCreate_time(long create_time) {
this.create_time = create_time;
}
@Override
public String toString() {
return "AppInfo{" +
"_id=" + _id +
", bk_inst_id='" + bk_inst_id + '\'' +
", bk_inst_name='" + bk_inst_name + '\'' +
", bk_supplier_account='" + bk_supplier_account + '\'' +
", screen_type=" + screen_type +
", sn='" + sn + '\'' +
", last_time=" + last_time +
", app_url='" + app_url + '\'' +
", bk_obj_id='" + bk_obj_id + '\'' +
", version_code='" + version_code + '\'' +
", version_name='" + version_name + '\'' +
", create_time=" + create_time +
'}';
}
}

View File

@@ -0,0 +1,16 @@
package com.mogo.eagle.core.data.bindingcar;
import java.io.Serializable;
import java.util.List;
/**
* @author lixiaopeng
* @description
* @since 6/21/22
*/
public class IdInfo implements Serializable {
private String timestamp;
private String date;
}

View File

@@ -0,0 +1,27 @@
package com.mogo.eagle.core.data.bindingcar;
import com.mogo.eagle.core.data.BaseData;
/**
* @author lixiaopeng
* @description app升级管理
* @since: 6/21/22
*/
public class UpgradeAppInfo extends BaseData {
public AppInfo data;
public AppInfo getData() {
return data;
}
public void setData(AppInfo data) {
this.data = data;
}
@Override
public String toString() {
return "UpgradeAppInfo{" +
"data=" + data +
'}';
}
}

View File

@@ -10,7 +10,17 @@ import java.util.List;
* @since: 3/15/22
*/
public interface IMoGoBindingcarProvider extends IMoGoFunctionServerProvider {
/**
* 修改工控机的绑定关系
* @param callBack
*/
void modifyCarInfo(BindingcarCallBack callBack);
/**
* 获取车辆的信息
* @param macAddress
* @param widevineIDWithMd5
*/
void getBindingcarInfo(String macAddress, String widevineIDWithMd5);
/**
@@ -27,4 +37,10 @@ public interface IMoGoBindingcarProvider extends IMoGoFunctionServerProvider {
* @param dockerVersion 当前工控机版本
*/
void queryContainers(String padSn,String dockerVersion);
/**
* 查询app是否有更新
*/
void queryAppUpgrade();
}

View File

@@ -205,6 +205,11 @@ interface IMoGoWaringProvider : IMoGoHmiViewProxy {
*/
fun showModifyBindingcarDialog()
/**
* 展示升级app弹框
*/
fun showUpgradeDialog(name: String, url: String)
/**
* 呈现工控机升级确认框
*/

View File

@@ -269,6 +269,10 @@ object CallerHmiManager : CallerBase() {
waringProviderApi?.showModifyBindingcarDialog()
}
fun showUpgradeDialog(name: String, url: String) {
waringProviderApi?.showUpgradeDialog(name, url)
}
/**
* 呈现工控机升级确认框
*/

View File

@@ -63,26 +63,26 @@ SERVICE_CHAIN_VERSION=1.1.0
LOGLIB_VERSION=1.3.1
######## MogoAiCloudSDK Version ########
# 网络请求LOGLIB_VERSION
MOGO_NETWORK_VERSION=1.4.3.3
MOGO_NETWORK_VERSION=1.4.3.6
# 鉴权
MOGO_PASSPORT_VERSION=1.4.3.3
MOGO_PASSPORT_VERSION=1.4.3.6
# 常链接
MOGO_SOCKET_VERSION=1.4.3.3
MOGO_SOCKET_VERSION=1.4.3.6
# 数据采集
MOGO_REALTIME_VERSION=1.4.3.3
MOGO_REALTIME_VERSION=1.4.3.6
# 探路,道路事件发布,获取
MOGO_TANLU_VERSION=1.4.3.3
MOGO_TANLU_VERSION=1.4.3.6
# 直播推流
MOGO_LIVE_VERSION=1.4.3.3
MOGO_LIVE_VERSION=1.4.3.6
# 直播拉流
MOGO_TRAFFICLIVE_VERSION=1.4.3.3
MOGO_TRAFFICLIVE_VERSION=1.4.3.6
# 定位服务
MOGO_LOCATION_VERSION=1.4.3.3
MOGO_LOCATION_VERSION=1.4.3.6
# 远程通讯模块
MOGO_TELEMATIC_VERSION=1.4.3.3
MOGO_TELEMATIC_VERSION=1.4.3.6
######## MogoAiCloudSDK Version ########
# 自研地图
MAP_SDK_VERSION=2.2.0.9
MAP_SDK_VERSION=2.2.1.1
MAP_SDK_OPERATION_VERSION=1.0.13
# websocket
WEBSOCKET_VERSION=1.1.7
@@ -155,7 +155,7 @@ MOGO_OCH_TAXI_VERSION=2.0.66
# mogoAiCloud sdk services
MOGO_AICLOUD_SERVICES_SDK_VERSION=2.1.16.10
# v2x-sdk
MOGO_V2X_SDK_VERSION=1.4.3.3
MOGO_V2X_SDK_VERSION=1.4.3.6
################# 旧版本架构模块版本 #################

View File

@@ -22,5 +22,6 @@ public class HostConst {
public static final String BINDING_SN_HOST = "https://mygateway.zhidaozhixing.com/cmdbapi/"; //中台提供的接口服务
public static final String BINDING_SN_HOST_TEST = "https://mygateway.zhidaozhixing.com/cmdbapitest/"; //中台提供的接口服务测试
public static final String UPGRADE_APP_HOST = "http://10.0.200.12:32423/unify/selectResources/";
}

View File

@@ -32,6 +32,12 @@ enum class EventTypeEnum(
"前方施工", "道路施工"
),
//施工-AI云下发
AI_ROAD_WORK(
"100061", "道路施工", "前方施工", R.drawable.icon_warning_v2x_road_construction,
"前方施工", "道路施工"
),
//拥堵
FOURS_BLOCK_UP(
"10007", "道路拥堵", "前方拥堵", R.drawable.icon_warning_v2x_congestion,
@@ -368,6 +374,7 @@ enum class EventTypeEnum(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeStr
ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeStr
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeStr
AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeStr
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeStr
FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeStr
FOURS_FOG.poiType -> FOURS_FOG.poiTypeStr
@@ -389,6 +396,7 @@ enum class EventTypeEnum(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeStrVr
ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeStrVr
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeStrVr
AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeStrVr
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeStrVr
FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeStrVr
FOURS_FOG.poiType -> FOURS_FOG.poiTypeStrVr
@@ -410,6 +418,7 @@ enum class EventTypeEnum(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeSrcVr
ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeSrcVr
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeSrcVr
AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeSrcVr
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeSrcVr
FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeSrcVr
FOURS_FOG.poiType -> FOURS_FOG.poiTypeSrcVr
@@ -431,7 +440,7 @@ enum class EventTypeEnum(
fun getPoiTypeBg(poiType: String, isVrMode: Boolean): Int {
return when (poiType) {
FOURS_BLOCK_UP.poiType, FOURS_LIVING.poiType-> if (isVrMode) R.drawable.bg_v2x_event_type_orange_vr else R.drawable.bg_v2x_event_type_orange
TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType,
TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType,AI_ROAD_WORK.poiType,
FOURS_PONDING.poiType, FOURS_FOG.poiType, FOURS_ICE.poiType, FOURS_ACCIDENT.poiType,
FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType,
FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> if (isVrMode) R.drawable.bg_v2x_event_type_red_vr else R.drawable.bg_v2x_event_type_read
@@ -447,7 +456,7 @@ enum class EventTypeEnum(
FOURS_BLOCK_UP.poiType, FOURS_LIVING.poiType ->
R.drawable.bg_v2x_event_type_orange
TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType,
FOURS_ROAD_WORK.poiType, FOURS_PONDING.poiType,
FOURS_ROAD_WORK.poiType,AI_ROAD_WORK.poiType, FOURS_PONDING.poiType,
FOURS_FOG.poiType, FOURS_ICE.poiType,
FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType,
FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType,
@@ -464,12 +473,12 @@ enum class EventTypeEnum(
fun isRoadEvent(poiType: String?): Boolean {
return when (poiType) {
TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType,
FOURS_ROAD_WORK.poiType, FOURS_BLOCK_UP.poiType,
FOURS_ROAD_WORK.poiType,AI_ROAD_WORK.poiType, FOURS_BLOCK_UP.poiType,
FOURS_PONDING.poiType, FOURS_FOG.poiType,
FOURS_ICE.poiType, FOURS_ACCIDENT.poiType,
FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType,
FOURS_ACCIDENT_05.poiType, GHOST_PROBE.poiType -> true
FOURS_ACCIDENT_05.poiType, GHOST_PROBE.poiType, AI_ROAD_WORK.poiType -> true
else -> false
}
}
@@ -480,7 +489,7 @@ enum class EventTypeEnum(
@JvmStatic
fun isNeedRoadEventUgc(poiType: String?): Boolean {
return when (poiType) {
ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType,
ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType,AI_ROAD_WORK.poiType,
FOURS_BLOCK_UP.poiType, FOURS_ACCIDENT.poiType,
FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType,
@@ -496,6 +505,7 @@ enum class EventTypeEnum(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.tts
ROAD_CLOSED.poiType -> ROAD_CLOSED.tts
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.tts
AI_ROAD_WORK.poiType -> AI_ROAD_WORK.tts
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.tts
FOURS_PONDING.poiType -> FOURS_PONDING.tts
FOURS_FOG.poiType -> FOURS_FOG.tts
@@ -512,6 +522,7 @@ enum class EventTypeEnum(
TRAFFIC_CHECK.poiType -> "交通检查"
ROAD_CLOSED.poiType -> "封路"
FOURS_ROAD_WORK.poiType -> "施工"
AI_ROAD_WORK.poiType -> "施工"
FOURS_BLOCK_UP.poiType -> "道路拥堵"
FOURS_PONDING.poiType -> "道路积水"
FOURS_FOG.poiType -> "出现浓雾"
@@ -528,6 +539,7 @@ enum class EventTypeEnum(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.content
ROAD_CLOSED.poiType -> ROAD_CLOSED.content
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.content
AI_ROAD_WORK.poiType -> AI_ROAD_WORK.content
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.content
FOURS_PONDING.poiType -> FOURS_PONDING.content
FOURS_FOG.poiType -> FOURS_FOG.content
@@ -547,6 +559,7 @@ enum class EventTypeEnum(
R.drawable.mogo_image_jiaotongjiancha_small
ROAD_CLOSED.poiType -> R.drawable.mogo_image_fenglu_small
FOURS_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_small
AI_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_small
FOURS_BLOCK_UP.poiType -> R.drawable.mogo_image_yongdu_small
FOURS_PONDING.poiType -> R.drawable.mogo_image_jishui_small
FOURS_ICE.poiType -> R.drawable.mogo_image_jiebing_small
@@ -564,6 +577,7 @@ enum class EventTypeEnum(
TRAFFIC_CHECK.poiType -> R.drawable.mogo_image_jiaotongjiancha_nor
ROAD_CLOSED.poiType -> R.drawable.mogo_image_fenglu_nor
FOURS_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_nor
AI_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_nor
FOURS_BLOCK_UP.poiType -> R.drawable.mogo_image_yongdu_nor
FOURS_PONDING.poiType -> R.drawable.mogo_image_jishui_nor
FOURS_ICE.poiType -> R.drawable.mogo_image_jiebing_nor
@@ -586,6 +600,7 @@ enum class EventTypeEnum(
FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> "交通事故"
FOURS_BLOCK_UP.poiType -> "拥堵"
FOURS_ROAD_WORK.poiType -> "施工"
AI_ROAD_WORK.poiType -> "施工"
FOURS_PONDING.poiType -> "道路积水"
else -> "实时路况"
}
@@ -600,6 +615,7 @@ enum class EventTypeEnum(
FOURS_FOG.poiType -> R.raw.v2x_nongwu
TRAFFIC_CHECK.poiType -> R.raw.v2x_jiaotongjiancha
FOURS_ROAD_WORK.poiType -> R.raw.v2x_daolushigong
AI_ROAD_WORK.poiType -> R.raw.v2x_daolushigong
FOURS_ICE.poiType -> R.raw.v2x_daolujiebing
FOURS_PONDING.poiType -> R.raw.v2x_daolujishui
GHOST_PROBE.poiType -> R.raw.v2x_guzhangqiuzhu
@@ -618,6 +634,7 @@ enum class EventTypeEnum(
FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> "交通事故"
FOURS_BLOCK_UP.poiType -> "拥堵"
FOURS_ROAD_WORK.poiType -> "施工"
AI_ROAD_WORK.poiType -> "施工"
FOURS_PONDING.poiType -> "道路积水"
else -> "实时路况"
}
@@ -638,6 +655,10 @@ enum class EventTypeEnum(
FOURS_ROAD_WORK.poiType -> {
R.drawable.v_to_x_marker_11
}
//AI施工
AI_ROAD_WORK.poiType -> {
R.drawable.v_to_x_marker_11
}
//拥堵
FOURS_BLOCK_UP.poiType -> {
R.drawable.v_to_x_marker_5
@@ -760,6 +781,7 @@ enum class EventTypeEnum(
TYPE_USECASE_ID_ROAD_GIVE_WAY.poiType -> TYPE_USECASE_ID_ROAD_GIVE_WAY.content
TYPE_VIP_IDENTIFICATION.poiType -> TYPE_VIP_IDENTIFICATION.content
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.content
AI_ROAD_WORK.poiType -> AI_ROAD_WORK.content
TYPE_ERROR.poiType -> TYPE_ERROR.content
TYPE_OPTIMAL_ROUTE_RECOMMEND.poiType -> TYPE_OPTIMAL_ROUTE_RECOMMEND.content
GHOST_PROBE.poiType -> GHOST_PROBE.content
@@ -802,6 +824,7 @@ enum class EventTypeEnum(
TYPE_USECASE_ID_ROAD_GIVE_WAY.poiType -> TYPE_USECASE_ID_ROAD_GIVE_WAY.tts
TYPE_VIP_IDENTIFICATION.poiType -> TYPE_VIP_IDENTIFICATION.tts
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.tts
AI_ROAD_WORK.poiType -> AI_ROAD_WORK.tts
TYPE_ERROR.poiType -> TYPE_ERROR.tts
TYPE_OPTIMAL_ROUTE_RECOMMEND.poiType -> TYPE_OPTIMAL_ROUTE_RECOMMEND.tts
GHOST_PROBE.poiType -> GHOST_PROBE.tts

View File

@@ -44,6 +44,8 @@ public class CloudPoiManager {
R.drawable.module_common_icon_map_marker_road_block_off2, R.drawable.module_common_icon_map_marker_road_block_off2_white, "封路"));
poiWrapper.put(EventTypeEnum.FOURS_ROAD_WORK.getPoiType(), new PoiWrapper(EventTypeEnum.FOURS_ROAD_WORK.getPoiType(),
R.drawable.module_common_icon_map_marker_road_work2, R.drawable.module_common_icon_map_marker_road_work2_white, "施工"));
poiWrapper.put(EventTypeEnum.AI_ROAD_WORK.getPoiType(), new PoiWrapper(EventTypeEnum.AI_ROAD_WORK.getPoiType(),
R.drawable.module_common_icon_map_marker_road_work2, R.drawable.module_common_icon_map_marker_road_work2_white, "施工"));
poiWrapper.put(EventTypeEnum.FOURS_BLOCK_UP.getPoiType(), new PoiWrapper(EventTypeEnum.FOURS_BLOCK_UP.getPoiType(),
R.drawable.module_common_icon_map_marker_road_block_up2, R.drawable.module_common_icon_map_marker_road_block_up2_white, "拥堵"));
poiWrapper.put(EventTypeEnum.FOURS_PONDING.getPoiType(), new PoiWrapper(EventTypeEnum.FOURS_PONDING.getPoiType(),

View File

@@ -66,7 +66,7 @@ public class MogoServiceProvider implements IMogoModuleProvider {
MarkerServiceHandler.init( context );
MogoServices.getInstance().preInit( context );
MogoServices.getInstance().init( AbsMogoApplication.getApp() );
MogoRouteOverlayManager.getInstance(context).init();
MogoRouteOverlayManager.getInstance().init();
}
@Override

View File

@@ -1,29 +1,25 @@
package com.mogo.module.service.routeoverlay;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_OLD_ROUTE;
import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import androidx.annotation.NonNull;
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.deva.scene.SceneModule;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import mogo.telematics.pad.MessagePad;
import mogo_msg.MogoReportMsg;
@@ -31,107 +27,57 @@ public class MogoRouteOverlayManager implements
IMoGoAutopilotPlanningListener, IMoGoAutopilotStatusListener,
IMoGoMapLocationListener {
private static volatile MogoRouteOverlayManager sInstance;
private Context mContext;
private String TAG = "route";
private static final String TAG = "Route";
private int STATUS_AUTOPILOT = 0;//0 非自动驾驶 ; 1 自动驾驶
// private MogoLatLng mEnding;
private MogoLocation mLocation;
private AtomicBoolean isArriveAtStation = new AtomicBoolean(false);
private final AtomicBoolean isArriveAtStation = new AtomicBoolean(false);
private volatile List<MessagePad.TrajectoryPoint> mTrajectoryList = null;
private List<MessagePad.TrajectoryPoint> mTrajectoryList = null;
private MogoRouteOverlayManager(Context context) {
mContext = context;
}
private final Lock mLock = new ReentrantLock();
private MogoRouteOverlayManager() {}
public void init() {
CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, this);
CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
CallerMapLocationListenerManager.INSTANCE.addListener(TAG, this);
// intiDrawer();
}
public static MogoRouteOverlayManager getInstance(Context context) {
public static MogoRouteOverlayManager getInstance() {
if (sInstance == null) {
synchronized (MogoRouteOverlayManager.class) {
if (sInstance == null) {
sInstance = new MogoRouteOverlayManager(context);
sInstance = new MogoRouteOverlayManager();
}
}
}
return sInstance;
}
private StringBuilder trajectoryMsg = null;
@Override
public void onAutopilotTrajectory(@NonNull List<MessagePad.TrajectoryPoint> items) {
long start = SystemClock.elapsedRealtime();
if (isArriveAtStation.get()) {
return;
}
if (items.isEmpty()) {
return;
}
MogoLocation location = mLocation;
if (location == null) {
return;
}
try {
if (isArriveAtStation.get()) {
return;
}
if (items.size() == 0) {
return;
}
MogoLocation location = mLocation;
if (location == null) {
return;
}
mLock.lock();
mTrajectoryList = items;
Map<String, SceneModule> tags = CallerDevaToolsManager.INSTANCE.getModuleTAG();
boolean isPrintLog = false;
if (tags != null && tags.containsKey(SceneConstant.M_OLD_ROUTE)) {
SceneModule scene = tags.get(M_OLD_ROUTE);
isPrintLog = scene.getLog();
}
if (isPrintLog) {
if (trajectoryMsg == null) {
trajectoryMsg = new StringBuilder(128);
}
if (trajectoryMsg.length() > 0) {
trajectoryMsg.setLength(0);
}
trajectoryMsg.append("{");
trajectoryMsg.append(System.currentTimeMillis()).append(";");
trajectoryMsg.append(location.getLongitude()).append(";");
trajectoryMsg.append(location.getLatitude()).append(";");
trajectoryMsg.append(location.getAltitude()).append(";");
trajectoryMsg.append(location.getBearing()).append(";");
trajectoryMsg.append(location.getSpeed()).append(";");
for (int i = 0; i < items.size(); i++) {
// 临时解决车尾拖线问题,丢弃距离车最近的几个经纬度,原因是惯性导航的中心靠近车尾,会导致经纬度靠近尾部,且两个数据不同频
MessagePad.TrajectoryPoint a = items.get(i);
double lon = a.getLongitude();
double lat = a.getLatitude();
trajectoryMsg.append(lon).append(",");
trajectoryMsg.append(lat).append(",");
}
trajectoryMsg.append("}");
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "receive router data:" + items.size());
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, trajectoryMsg.toString());
} else {
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "receive router data:" + items.size());
}
} finally {
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "--- onAutopilotTrajectory -- cost:" + (SystemClock.elapsedRealtime() - start) + " ms");
mLock.unlock();
}
}
@Override
public void onAutopilotRotting(MessagePad.GlobalPathResp globalPathResp) {
// if (globalPathResp == null || globalPathResp.getWayPointsList().size() == 0) {
// return;
// }
// List<MogoLatLng> latLngList = new ArrayList<>();
// for (MessagePad.Location routeModel : globalPathResp.getWayPointsList()) {
// latLngList.add(new MogoLatLng(routeModel.getLatitude(), routeModel.getLongitude()));
// }
// int listSize = latLngList.size();
// mEnding = latLngList.get(listSize - 1);
// RouteOverlayDrawer.getInstance(mContext).addEndingMarker(latLngList.get(listSize - 1).lat,latLngList.get(listSize - 1).lon);
}
public void onAutopilotRotting(MessagePad.GlobalPathResp globalPathResp) {}
@Override
@@ -144,34 +90,20 @@ public class MogoRouteOverlayManager implements
if (this.STATUS_AUTOPILOT == 1) {
isArriveAtStation.set(false);
}
//CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG ,"onAutopilotStatusResponse:"+STATUS_AUTOPILOT);
// if (STATUS_AUTOPILOT == 1 ){
// if (mEnding != null){
// RouteOverlayDrawer.getInstance(mContext).addEndingMarker(mEnding.lat,mEnding.lon);
// }
// }else {
//
// }
if (STATUS_AUTOPILOT != 1) {
RouteOverlayDrawer.getInstance(mContext).clearEndingMarker();
RouteOverlayDrawer.getInstance(mContext).clearMogoRouteOverlay();
RouteOverlayDrawer.getInstance().clearMogoRouteOverlay();
}
}
@Override
public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification arrivalNotification) {
if (arrivalNotification == null) {
return;
}
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "onArriveAt data : " + arrivalNotification);
// //演示模式下 到达终点将忽略 引导线绘制 选项关闭
// FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
Log.d(TAG, "onArriveAt data : " + arrivalNotification);
if (!isArriveAtStation.get()) {
isArriveAtStation.set(true);
RouteOverlayDrawer.getInstance(mContext).clearEndingMarker();
RouteOverlayDrawer.getInstance(mContext).clearMogoRouteOverlay();
RouteOverlayDrawer.getInstance().clearMogoRouteOverlay();
}
}
@@ -186,7 +118,6 @@ public class MogoRouteOverlayManager implements
if (from != 1) {
return;
}
long start = SystemClock.elapsedRealtime();
boolean isExcept = false;
try {
if (location == null) {
@@ -194,14 +125,13 @@ public class MogoRouteOverlayManager implements
return;
}
if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || STATUS_AUTOPILOT == 1) {
RouteOverlayDrawer.getInstance(mContext).drawTrajectoryList(location, mTrajectoryList);
RouteOverlayDrawer.getInstance().drawTrajectoryList(mLock, location, mTrajectoryList);
}
} finally {
mLocation = location;
if (isExcept) {
RouteOverlayDrawer.getInstance(mContext).setVisible(false);
RouteOverlayDrawer.getInstance().hide();
}
// CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "--- onLocationChanged -- cost:" + (SystemClock.elapsedRealtime() - start) + " ms");
}
}

View File

@@ -1,70 +1,42 @@
package com.mogo.module.service.routeoverlay;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_OLD_ROUTE;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.SystemClock;
import android.util.Log;
import androidx.core.util.Pools;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.ColorUtils;
import com.mogo.map.MogoMarkerManager;
import com.mogo.map.MogoOverlayManager;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.map.overlay.IMogoOverlayManager;
import com.mogo.map.overlay.IMogoPolyline;
import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.module.common.utils.DrivingDirectionUtils;
import com.mogo.module.service.R;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import mogo.telematics.pad.MessagePad;
public class RouteOverlayDrawer {
private static final String TAG = "MogoRouteOverlayManager";
private volatile IMogoPolyline mMoGoPolyline;
// 连接线参数
private final MogoPolylineOptions mPolylineOptions;
private Handler mRenderHandler;
private final Bitmap endingBitmap;
private final Context mContext;
// private Handler mLogHandler;
IMogoOverlayManager mogoOverlayManager;
private IMogoMarker endMarker;
private MogoMarkerOptions markerOptions;
private static volatile RouteOverlayDrawer sInstance;
private static final String markerType = "route_ending";
private RouteOverlayDrawer(Context context) {
mPolylineOptions = new MogoPolylineOptions();
mPolylineOptions.zIndex(75000f);
mPolylineOptions.setGps(true);
// 引导线颜色,
private RouteOverlayDrawer() {
// 渐变色
mContext = context;
mogoOverlayManager = MogoOverlayManager.getInstance();
endingBitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.icon_route_ending);
List<Integer> list = new ArrayList<>();
int[] startColor = ColorUtils.hexToArgb("#CC64C3EA");
int[] endColor = ColorUtils.hexToArgb("#0064C3EA");
list.add(Color.argb(startColor[0], startColor[1], startColor[2], startColor[3]));
list.add(Color.argb(endColor[0], endColor[1], endColor[2], endColor[3]));
// 线条粗细,渐变,渐变色值
mPolylineOptions.width(20).useGradient(true).colorValues(list);
HandlerThread renderTask = new HandlerThread("routing_render") {
@Override
protected void onLooperPrepared() {
@@ -73,153 +45,307 @@ public class RouteOverlayDrawer {
}
};
renderTask.start();
// HandlerThread logHandler = new HandlerThread("log_handler") {
// @Override
// protected void onLooperPrepared() {
// super.onLooperPrepared();
// mLogHandler = new Handler(getLooper());
// }
// };
// logHandler.start();
}
public static RouteOverlayDrawer getInstance(Context context) {
public static RouteOverlayDrawer getInstance() {
if (sInstance == null) {
synchronized (RouteOverlayDrawer.class) {
if (sInstance == null) {
sInstance = new RouteOverlayDrawer(context);
sInstance = new RouteOverlayDrawer();
}
}
}
return sInstance;
}
public synchronized void release() {
sInstance = null;
}
private Object readResolve() {
// 阻止反序列化,必须实现 Serializable 接口
return sInstance;
}
public void addEndingMarker(double lat, double lon) {
if (endMarker != null) {
return;
}
if (markerOptions == null) {
markerOptions = new MogoMarkerOptions()
.matchOnRoadSide(true)
.gps(true)
.icon(endingBitmap)
.owner(markerType)
.anchor(0.5f, 0.5f)
.scale(0.5f)
.zIndex(30001);
// .object(markerShowEntity)
}
markerOptions.latitude(lat).longitude(lon);
//CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG,"addEndingMarker-"+lat+":"+lon);
endMarker = MogoMarkerManager.getInstance(mContext).addMarker(markerType, markerOptions);
// if (DebugConfig.isDebug()){
// ToastUtils.showLong("绘制终点marker,"+lat+":"+lon);
// }
}
public void clearMogoRouteOverlay() {
if (mMoGoPolyline != null) {
mMoGoPolyline.remove();
mMoGoPolyline = null;
}
if (mRenderTask != null) {
if (mRenderTask != null && mRenderHandler != null) {
mRenderTask.remove();
mRenderHandler.removeCallbacks(mRenderTask);
}
}
public void clearEndingMarker() {
//CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG,"clearEndingMarker");
endMarker = null;
MogoMarkerManager.getInstance(mContext).removeMarkers(markerType);
public void remove() {
if (mRenderTask != null && mRenderHandler != null) {
mRenderTask.remove();
mRenderHandler.removeCallbacks(mRenderTask);
}
}
public void hide() {
if (mRenderTask != null && mRenderHandler != null) {
mRenderTask.hide();
mRenderHandler.removeCallbacks(mRenderTask);
}
}
private static class RenderOptions {
private IMogoPolyline mPolyLine;
private final MogoPolylineOptions mOptions;
private static int taskSequence = 0;
//private Handler mHandler;
private final IMogoOverlayManager mOverlayManager;
//private ChildRenderTask mTask;
private class ChildRenderTask implements Runnable {
private List<Integer> colors;
private List<MogoLatLng> points;
public void setData(List<Integer> colors, List<MogoLatLng> points) {
this.colors = colors;
this.points = points;
}
@Override
public void run() {
if (this.colors == null || this.colors.isEmpty()) {
return;
}
if (this.points == null || this.points.isEmpty()) {
return;
}
mOptions.colorValues(colors);
mOptions.points(points);
if (mPolyLine == null || mPolyLine.isDestroyed()) {
mPolyLine = mOverlayManager.addPolyline(mOptions);
} else {
mPolyLine.setOption(mOptions);
}
if (mPolyLine != null && !mPolyLine.isVisible()) {
mPolyLine.setVisible(true);
}
}
}
public RenderOptions(IMogoOverlayManager overlay) {
mOverlayManager = overlay;
mOptions = new MogoPolylineOptions().width(20).useGradient(true).zIndex(75000f).setGps(true);
// new HandlerThread("child-render-" +(taskSequence++)) {
// @Override
// protected void onLooperPrepared() {
// super.onLooperPrepared();
// mHandler = new Handler(getLooper());
// }
// }.start();
}
public void show(List<Integer> colors, List<MogoLatLng> points) {
// if (mTask == null) {
// mTask = new ChildRenderTask();
// }
// mTask.setData(colors, points);
// if (mHandler != null) {
// mHandler.removeCallbacks(mTask);
// mHandler.post(mTask);
// }
mOptions.colorValues(colors);
mOptions.points(points);
if (mPolyLine == null || mPolyLine.isDestroyed()) {
mPolyLine = mOverlayManager.addPolyline(mOptions);
} else {
mPolyLine.setOption(mOptions);
}
if (mPolyLine != null && !mPolyLine.isVisible()) {
mPolyLine.setVisible(true);
}
}
public void hide() {
// if (mTask != null && mHandler != null) {
// mHandler.removeCallbacks(mTask);
// }
if (mPolyLine != null && mPolyLine.isVisible()) {
mPolyLine.setVisible(false);
}
}
public void remove() {
// if (mTask != null && mHandler != null) {
// mHandler.removeCallbacks(mTask);
// }
if (mPolyLine != null && !mPolyLine.isDestroyed()) {
mPolyLine.remove();
mPolyLine = null;
}
}
}
private class RenderTask implements Runnable {
private volatile List<MessagePad.TrajectoryPoint> routeList;
private volatile MogoLocation location;
private List<MessagePad.TrajectoryPoint> routeList;
private MogoLocation location;
private final Pools.Pool<MogoLatLng> pools;
private final LinkedList<MogoLatLng> points;
private final Pools.Pool<RenderOptions> options;
private Lock mLock;
public RenderTask() {
this.pools = new Pools.SimplePool<>(500);
this.points = new LinkedList<>();
this.options = new Pools.SimplePool<>(5);
}
public void setData(MogoLocation location, List<MessagePad.TrajectoryPoint> routeList) {
public void setData(Lock lock, MogoLocation location, List<MessagePad.TrajectoryPoint> routeList) {
this.location = location;
this.routeList = routeList;
this.mLock = lock;
}
@SuppressLint("LongLogTag")
@Override
public void run() {
LinkedList<MogoLatLng> points = this.points;
points.clear();
Lock lock = this.mLock;
if (lock == null) {
return;
}
LinkedList<MogoLatLng> pps = this.points;
boolean isExcept = false;
// StringBuilder sb;
int total;
try {
pps.clear();
long drawStart = SystemClock.elapsedRealtime();
List<MessagePad.TrajectoryPoint> routes = this.routeList;
int total;
if (routes == null || (total = routes.size()) < 2) {
isExcept = true;
return;
}
for (int i = 0; i < total; i++) {
MessagePad.TrajectoryPoint route = null;
try {
route = routes.get(i);
if (route == null) {
continue;
try {
lock.lock();
List<MessagePad.TrajectoryPoint> routes = this.routeList;
if (routes == null || (total = routes.size()) < 2) {
isExcept = true;
return;
}
RouteStrategy.INSTANCE.start();
// sb = new StringBuilder();
// sb.append(System.currentTimeMillis()).append(" ");
for (int i = 0; i < total; i++) {
MessagePad.TrajectoryPoint route = null;
try {
route = routes.get(i);
if (route == null) {
continue;
}
} catch (Throwable t) {
Log.d("Route", "render-error:" + t.getMessage());
}
} catch (Throwable t) {
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "render-error:" + t.getMessage());
if (route == null) {
//数组越界了,结束循环
break;
}
// sb.append(route.getVelocity()).append(" ");
// sb.append(route.getAcceleration()).append(" ");
// sb.append(route.getAccumulatedDis()).append(" ");
MogoLatLng acquire = pools.acquire();
double latitude = route.getLatitude();
double longitude = route.getLongitude();
if (acquire == null) {
acquire = new MogoLatLng(latitude, longitude);
} else {
acquire.lon = longitude;
acquire.lat = latitude;
}
pps.add(acquire);
RouteStrategy.INSTANCE.check(route.getVelocity(), route.getAcceleration());
}
if (route == null) {
//数组越界了,结束循环
break;
RouteStrategy.INSTANCE.end();
} finally {
lock.unlock();
}
Strategy strategy = RouteStrategy.INSTANCE.getStrategy();
/// Log.d("ROUTE_XX", "strategy:" + strategy + "->route: " +sb);
// StringBuilder newSb = new StringBuilder("strategy:" + strategy + "->route: ");
// newSb.append(sb);
// if (mLogHandler != null) {
// mLogHandler.sendMessage(Message.obtain(mLogHandler, () -> {
// BufferedWriter bw = null;
// try {
// File file = new File(Environment.getExternalStorageDirectory(), "log.txt");
// if (!file.exists()) {
// file.createNewFile();
// }
// bw = new BufferedWriter(new FileWriter(file, true));
// bw.write(newSb.toString());
// bw.newLine();
// bw.flush();
// } catch (Throwable t) {
// try {
// if (bw != null) {
// bw.close();
// }
// } catch (Throwable t2) {
//
// }
// }
// }));
// }
Integer[] indexes = strategy.getIndexes();
Integer[] colors = strategy.getColors();
LinkedList<LinkedList<MogoLatLng>> parts = new LinkedList<>();
if (indexes.length > 0) {
for (int i = 0; i < indexes.length; i += 2) {
int startIndex = indexes[i];
int endIndex = indexes[i + 1];
parts.add(new LinkedList<>(pps.subList(startIndex, Math.min(endIndex + 1, pps.size()))));
}
MogoLatLng acquire = pools.acquire();
double latitude = route.getLatitude();
double longitude = route.getLongitude();
if (acquire == null) {
acquire = new MogoLatLng(latitude, longitude);
} else {
acquire.lon = longitude;
acquire.lat = latitude;
}
points.add(acquire);
}
double lon = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon();
double lat = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat();
int removeCount = 0;
if (points.size() > 0) {
MogoLatLng top = null;
while (points.size() != 0) {
MogoLatLng first = points.peek();
if (first == null) {
int colorsIndex = 0;
if (!parts.isEmpty()) {
L:while (!parts.isEmpty()) {
LinkedList<MogoLatLng> part = parts.peek();
if (part == null) {
continue;
}
if (first == top) {
break;
MogoLatLng top = null;
while (!part.isEmpty()) {
MogoLatLng first = part.peek();
if (first == null) {
part.poll();
continue;
}
if (first == top) {
break L;
}
lon = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon();
lat = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat();
long angle = isPointOnCarFront(lon, lat, location.getBearing(), first.lon, first.lat);
if (angle >= 90) {
removeCount++;
pps.remove(first);
try {
pools.release(first);
} catch (Throwable ignore) {
} finally {
part.poll();
}
}
top = first;
}
lon = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon();
lat = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat();
long angle = isPointOnCarFront(lon, lat, location.getBearing(), first.lon, first.lat);
if (angle >= 90) {
removeCount++;
pools.release(first);
points.poll();
}
top = first;
parts.poll();
colorsIndex += 2;
}
if (points.size() == 0) {
if (parts.isEmpty()) {
isExcept = true;
return;
}
MogoLatLng self = pools.acquire();
if (self == null) {
self = new MogoLatLng(lat, lon);
@@ -227,70 +353,102 @@ public class RouteOverlayDrawer {
self.lat = lat;
self.lon = lon;
}
points.addFirst(self);
if (mMoGoPolyline == null || mMoGoPolyline.isDestroyed()) {
mPolylineOptions.points(points);
mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions);
} else {
mPolylineOptions.points(points);
mMoGoPolyline.setOption(mPolylineOptions);
pps.addFirst(self);
parts.get(0).addFirst(self);
List<RenderOptions> ll = new ArrayList<>();
for (int i = 0; i < parts.size(); i++) {
LinkedList<MogoLatLng> ps = parts.get(i);
RenderOptions options = this.options.acquire();
if (options == null) {
options = new RenderOptions(mogoOverlayManager);
}
ll.add(options);
List<Integer> cls = new ArrayList<>();
cls.add(colors[colorsIndex++]);
cls.add(colors[colorsIndex++]);
options.show(cls, ps);
}
if (mMoGoPolyline != null && !mMoGoPolyline.isDestroyed() && !mMoGoPolyline.isVisible()) {
mMoGoPolyline.setVisible(true);
hide();
for (int i = ll.size() - 1; i >= 0 ; i--) {
this.options.release(ll.get(i));
}
} else {
isExcept = true;
}
long drawEnd = SystemClock.elapsedRealtime();
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "drawTrajectoryList cost : " + (drawEnd - drawStart) + "ms and isExcept:" + isExcept + "::removeCount:" + removeCount + "::total:" + total);
Log.d("Route", "draw cost:" + (drawEnd - drawStart) + "ms and isExcept:" + isExcept + "::removeCount:" + removeCount + "::total:" + total);
} catch (Throwable t) {
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "drawTrajectoryList error (isExcept: "+isExcept+") : " + t);
Log.d("Route","error:" + Log.getStackTraceString(t));
} finally {
if (isExcept) {
setVisible(false);
}
if (points.size() > 0) {
for (int i = 0; i < points.size(); i++) {
MogoLatLng latLng = points.get(i);
if (latLng == null) {
continue;
}
pools.release(latLng);
try {
if (isExcept) {
hide();
}
if (!pps.isEmpty()) {
for (int i = 0; i < pps.size(); i++) {
MogoLatLng latLng = pps.get(i);
if (latLng == null) {
continue;
}
pools.release(latLng);
}
}
} catch (Throwable t) {
Log.d("Route", "error2:" + Log.getStackTraceString(t));
}
}
}
private void hide() {
List<RenderOptions> list = new ArrayList<>();
RenderOptions acquire = this.options.acquire();
while (acquire != null) {
acquire.hide();
list.add(acquire);
acquire = this.options.acquire();
}
for (int i = 0; i < list.size(); i++) {
this.options.release(list.get(i));
}
}
public void remove() {
List<RenderOptions> list = new ArrayList<>();
RenderOptions acquire = this.options.acquire();
while (acquire != null) {
acquire.remove();
list.add(acquire);
acquire = this.options.acquire();
}
for (int i = 0; i < list.size(); i++) {
this.options.release(list.get(i));
}
}
private long isPointOnCarFront(double car_lon, double car_lat, double car_head, double lon, double lat) {
long start = SystemClock.elapsedRealtime();
try {
// 计算车辆与点之间的夹角
long diffAngle = DrivingDirectionUtils.getDegreeOfCar2Poi2(
car_lon, car_lat, lon, lat, car_head);
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "isPointOnCarFront: angle->" + diffAngle);
Log.d("Route", "isPointOnCarFront: angle->" + diffAngle);
return diffAngle;
} finally {
CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "isPointOnCarFront cost:" + (SystemClock.elapsedRealtime() - start) + "ms");
Log.d("Route", "isPointOnCarFront cost:" + (SystemClock.elapsedRealtime() - start) + "ms");
}
}
}
private volatile RenderTask mRenderTask;
private RenderTask mRenderTask;
public void drawTrajectoryList(MogoLocation carLoc, List<MessagePad.TrajectoryPoint> routeList) {
public void drawTrajectoryList(Lock lock, MogoLocation carLoc, List<MessagePad.TrajectoryPoint> routeList) {
if (mRenderTask == null) {
mRenderTask = new RenderTask();
}
mRenderTask.setData(carLoc, routeList);
mRenderTask.setData(lock, carLoc, routeList);
if (mRenderHandler != null) {
mRenderHandler.removeCallbacks(mRenderTask);
mRenderHandler.post(mRenderTask);
}
}
public void setVisible(boolean isVisible) {
if (mMoGoPolyline != null && !mMoGoPolyline.isDestroyed()) {
mMoGoPolyline.setVisible(isVisible);
}
}
}

View File

@@ -0,0 +1,202 @@
package com.mogo.module.service.routeoverlay
import android.graphics.*
import com.mogo.eagle.core.data.config.*
import com.mogo.eagle.core.utilcode.mogo.*
import java.lang.Double.NaN
import java.util.*
import kotlin.collections.ArrayList
interface IStrategy {
fun getColors(): Array<Int>
fun getIndexes(): Array<Int>
}
class Colors {
companion object {
val COLOR_BLUE_DARK = Color.parseColor("#2ABAD9")
val COLOR_BLUE_LIGHT = Color.parseColor("#332ABAD9")
val COLOR_RED_DARK = Color.parseColor("#CA4C15")
val COLOR_TRANSPARENT = Color.parseColor("#002ABAD9")
}
}
sealed class Strategy: IStrategy
class Uniform(private val count: Int, private val colors: Array<Int>? = null): Strategy() {
override fun getColors(): Array<Int> = colors ?: arrayOf(Colors.COLOR_BLUE_DARK, Colors.COLOR_TRANSPARENT)
override fun getIndexes(): Array<Int> = arrayOf(0, count)
}
class SlowDown(private val colors: Array<Int>, private val indexes: Array<Int>): Strategy() {
override fun getColors(): Array<Int> = colors
override fun getIndexes(): Array<Int> = indexes
override fun toString(): String {
return indexes.joinToString(",")
}
}
class SpeedUp(private val count: Int): Strategy() {
override fun getColors(): Array<Int> = arrayOf(Colors.COLOR_BLUE_DARK, Colors.COLOR_TRANSPARENT)
override fun getIndexes(): Array<Int> = arrayOf(0, count)
}
object RouteStrategy {
private var strategy: Strategy? = null
private var index: Int = 0
private var oldV: Double = NaN
private var oldA: Double = NaN
private var mode: Int = -1 // 0: 匀速, 1:减速, 2: 加速
private val colors4SlowDown: LinkedList<Int> = LinkedList()
private val colors4Uniform: LinkedList<Int> = LinkedList()
private val indexes4SlowDown: LinkedList<Int> = LinkedList()
private var isLightBlueAll = false
private var isRedBlue = false
private var ignore = false
private var firstV: Double = NaN
private var isEnable = AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)
fun enable(enable: Boolean) {
isEnable = enable
}
fun start() {
strategy = null
index = 0
mode = -1
ignore = false
colors4Uniform.clear()
colors4SlowDown.clear()
indexes4SlowDown.clear()
isLightBlueAll = false
isRedBlue = false
oldA = NaN
oldV = NaN
firstV = NaN
}
fun end() {
strategy = acquireStrategy()
}
private fun acquireStrategy(): Strategy? {
if (mode == 0) {
return if (colors4Uniform.isNotEmpty()) Uniform(index, colors = Array(colors4Uniform.size) {
colors4Uniform[it]
}) else null
}
if (mode == 2) {
return SpeedUp(index)
}
if (indexes4SlowDown.isEmpty() || !isLightBlueAll) {
return null
}
val count = indexes4SlowDown.size
if (count == 3) {
val colors = when {
isRedBlue -> {
arrayOf(Colors.COLOR_RED_DARK, Colors.COLOR_BLUE_DARK, Colors.COLOR_BLUE_LIGHT, Colors.COLOR_TRANSPARENT)
}
else -> {
return Uniform(index)
}
}
val indexes = ArrayList<Int>()
val i = indexes4SlowDown[2]
if (index - i < 5) {
return Uniform(index)
}
indexes += 0
indexes += i
indexes += i
indexes += index
return SlowDown(colors, indexes = indexes.toTypedArray())
}
return null
}
fun check(speed: Double, acc: Double) {
try {
if (!isEnable){
return
}
if (ignore) {
return
}
if (oldV.isNaN()) {
return
}
if (oldA.isNaN()) {
return
}
if (index < 3) {
//丢掉前3个点
return
}
if (firstV.isNaN()) {
firstV = speed;
return
}
if (speed == oldV) {
if (speed <= 0.01) {
colors4Uniform.clear()
colors4Uniform.add(Colors.COLOR_BLUE_LIGHT)
colors4Uniform.add(Colors.COLOR_TRANSPARENT)
}
ignore = true
mode = 0
return
}
if (speed > oldV) {
mode = 2
ignore = true
return
}
if (speed < oldV) {
if (mode != 1) {
indexes4SlowDown.add(0)
mode = 1
}
}
if (mode == 1) {
if (!isLightBlueAll && speed <= 0.01) {
isLightBlueAll = true
indexes4SlowDown.add(index)
ignore = true
return
}
if (!isRedBlue && firstV > 0 && speed > 0 && speed <= firstV / 2.0) {
isRedBlue = true
indexes4SlowDown.add(index)
}
}
} finally {
index++
oldV = speed
oldA = acc
}
}
fun getStrategy(): Strategy = if (isEnable) strategy ?: Uniform(index) else SpeedUp(index)
}