Merge remote-tracking branch 'origin/dev_robotaxi-d_240912_6.7.2_local' into dev_robotaxi-d_240912_6.7.2_local

This commit is contained in:
donghongyu-pc
2024-10-25 17:52:14 +08:00
13 changed files with 400 additions and 28 deletions

View File

@@ -0,0 +1,99 @@
package com.mogo.och.biz.skin
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.och.biz.R
import com.mogo.och.biz.skin.bean.SkinRespBean
import com.mogo.och.biz.skin.net.OchSkinServiceManager
import com.mogo.och.common.module.biz.skin.SkinService
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.skin.Skin
import com.mogo.skin.SkinManager
import com.mogo.skin.utils.FileUtils
@Route(path = OchCommonConst.BIZ_SKIN)
class SkinProvider : SkinService {
private var context: Context?= null
private val TAG = "SkinProvider"
override fun loadNewSkin() {
OchChainLogManager.writeChainLogSkin("皮肤信息","请求皮肤信息")
context?.let{
OchSkinServiceManager.querySkinBysn(it,object : OchCommonServiceCallback<SkinRespBean>{
override fun onSuccess(data: SkinRespBean?) {
OchChainLogManager.writeChainLogSkin("皮肤信息","请求皮肤信息成功:${data}")
if (null != data && 0 == data.code) {
if(data.data==null){
SkinManager.getInstance().loadSkin("")
OchChainLogManager.writeChainLogSkin("皮肤信息", "皮肤还原成功")
}else {
data.data?.let { skinInfo ->
if(skinInfo.empty()){
SkinManager.getInstance().loadSkin("")
OchChainLogManager.writeChainLogSkin("皮肤信息", "皮肤还原成功")
return
}
val skin = Skin(
skinInfo.md5,
skinInfo.name,
skinInfo.url
)
//换肤
SkinManager.getInstance().downloadSkin(it, skin, object :
SkinManager.SkinLoadListener {
override fun onLoadSuccess() {
//MogoAnalyticUtils.track()
d(TAG, "皮肤下载成功……开始解压Raw下的视频")
OchChainLogManager.writeChainLogSkin(
"皮肤信息",
"加载皮肤成功:${data}"
)
FileUtils.copyVideoRawToFile(it, R.raw::class.java.fields)
}
override fun onLoadFailed(e: java.lang.Exception?) {
OchChainLogManager.writeChainLogSkin(
"皮肤信息",
"加载皮肤失败:${e}"
)
RxUtils.createSubscribe(5_000) {
loadNewSkin()
}
}
})
}
}
}
}
override fun onError() {
super.onError()
OchChainLogManager.writeChainLogSkin("皮肤信息","请求皮肤信息网络失败5s后重试")
RxUtils.createSubscribe(5_000) {
loadNewSkin()
}
}
override fun onFail(code: Int, msg: String?) {
OchChainLogManager.writeChainLogSkin("皮肤信息","请求皮肤信息失败code:${code} msg:${msg} 5s后重试")
RxUtils.createSubscribe(5_000) {
loadNewSkin()
}
}
})
}
}
override fun init(context: Context?) {
this.context = context
}
}

View File

@@ -0,0 +1,25 @@
package com.mogo.och.biz.skin.bean
import com.mogo.eagle.core.data.BaseData
import com.mogo.och.common.module.biz.login.LoginInfo
/**
* Created by pangfan on 2021/8/19
*
* 状态查询返回数据结构
*/
data class SkinRespBean(var data: Result?) : BaseData() {
data class Result(
var id: Long,
var name: String?,
var url: String?,
var md5: String?,
) {
fun empty(): Boolean {
if(id<=0||name.isNullOrEmpty()||url.isNullOrEmpty()||md5.isNullOrEmpty()){
return true
}
return false
}
}
}

View File

@@ -0,0 +1,31 @@
package com.mogo.och.biz.skin.net;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.biz.login.bean.DriverStatusQueryRespBean;
import com.mogo.och.biz.login.bean.TaxiLoginReqBean;
import com.mogo.och.biz.login.bean.TaxiLoginRespBean;
import com.mogo.och.biz.login.bean.TaxiLoginSmsReqBean;
import com.mogo.och.biz.login.bean.TaxiLogoutReqBean;
import com.mogo.och.biz.skin.bean.SkinRespBean;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created by pangfan on 2021/8/19
* <p>
* 网约车-出租车接口定义
*/
interface OchSkinServiceApi {
@Headers({"Content-type:application/json;charset=UTF-8"})
@GET("/och-vehicle/api/resource/queryBySn")
Observable<SkinRespBean> querySkinBysn(@Header("appId") String appId
, @Header("ticket") String ticket, @Query("sn") String sn);
}

View File

@@ -0,0 +1,58 @@
package com.mogo.och.biz.skin.net
import android.content.Context
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.och.biz.login.bean.DriverStatusQueryRespBean
import com.mogo.och.biz.skin.bean.SkinRespBean
import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.manager.cache.OchSPManager
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.network.interceptor.transformTry
object OchSkinServiceManager {
private const val TAG = "OchCommonServiceManager"
private val ochSkinService: OchSkinServiceApi by lazy {
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
OchSkinServiceApi::class.java
)
}
/**
* 接单状态和登录状态查询
*
* @param context
* @param callback
*/
@JvmStatic
fun querySkinBysn(
context: Context,
callback: OchCommonServiceCallback<SkinRespBean>?
) {
CallerLogger.d(TAG, "queryDriverServiceStatus:查询登录状态");
val sn =
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
OchSPManager.getSn()
} else{
LoginLanPassengerSocket.driverSn
}
ochSkinService.querySkinBysn(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
sn
).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "querySkinBysn",false))
}
}

View File

@@ -0,0 +1,51 @@
package com.mogo.och.common.module.biz.skin
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.och.common.module.biz.lansocket.IOchLanPassengerStatusListener
import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.manager.cache.OchSPManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.utils.RxUtils
object SkinManager : IOchLanPassengerStatusListener {
private val TAG = "SkinManager"
private var skinService: SkinService? =
ARouter.getInstance().build(OchCommonConst.BIZ_SKIN).navigation() as SkinService
init {
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
LoginLanPassengerSocket.addListener(TAG,this)
}
}
fun load(){
OchChainLogManager.writeChainLogInit("初始化信息","初始化皮肤信息")
loadNewSkin()
}
private fun loadNewSkin(){
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
val driverSn = OchSPManager.getSn()
if(driverSn.isNullOrEmpty()){
OchChainLogManager.writeChainLogSkin("司机皮肤信息","没有sn 需要等待5s再去请求")
RxUtils.createSubscribe(5_000) {
skinService?.loadNewSkin()
}
}else{
skinService?.loadNewSkin()
}
} else{
skinService?.loadNewSkin()
}
}
override fun onDriverSnChagneListner(sn: String?) {
OchChainLogManager.writeChainLogSkin("乘客皮肤信息","司机屏sn变化 重新加载皮肤")
skinService?.loadNewSkin()
}
}

View File

@@ -0,0 +1,9 @@
package com.mogo.och.common.module.biz.skin
import com.alibaba.android.arouter.facade.template.IProvider
interface SkinService : IProvider {
fun loadNewSkin()
}

View File

@@ -29,6 +29,7 @@ class OchCommonConst {
const val WAIT_TAKEN = 100046 const val WAIT_TAKEN = 100046
const val BIZ_LOGIN = "/ochbiz/common/login" const val BIZ_LOGIN = "/ochbiz/common/login"
const val BIZ_SKIN = "/ochbiz/common/skin"
const val BUS_DRIVER = "/busdriver/busdriver" const val BUS_DRIVER = "/busdriver/busdriver"
const val BUS_PASSENGER = "/buspassenger/buspassenger" const val BUS_PASSENGER = "/buspassenger/buspassenger"

View File

@@ -39,6 +39,8 @@ object OchChainLogManager {
// 初始化信息 // 初始化信息
const val EVENT_KEY_INFO_INIT = "event_key_och_init" const val EVENT_KEY_INFO_INIT = "event_key_och_init"
// 初始化信息
const val EVENT_KEY_INFO_SKIN = "event_key_och_skin"
// 局域网内socket 通讯 // 局域网内socket 通讯
const val EVENT_KEY_INFO_SOCKET = "analytics_event_och_track_screen_msg" const val EVENT_KEY_INFO_SOCKET = "analytics_event_och_track_screen_msg"
@@ -84,6 +86,11 @@ object OchChainLogManager {
fun writeChainLogInit(title: String, info: String) { fun writeChainLogInit(title: String, info: String) {
writeChainLog(title,info,true,EVENT_KEY_INFO_INIT) writeChainLog(title,info,true,EVENT_KEY_INFO_INIT)
} }
fun writeChainLogSkin(title: String, info: String) {
writeChainLog(title,info,true,EVENT_KEY_INFO_SKIN)
}
fun writeChainLogNetLanSocketConnect(title: String, info: String){ fun writeChainLogNetLanSocketConnect(title: String, info: String){
writeChainLog(title,info,true,EVENT_KEY_INFO_SOCKET_CONNECT) writeChainLog(title,info,true,EVENT_KEY_INFO_SOCKET_CONNECT)
} }

View File

@@ -36,12 +36,10 @@ import com.mogo.och.common.module.biz.login.ILoginCallback
import com.mogo.och.common.module.biz.login.LoginStatusEnum import com.mogo.och.common.module.biz.login.LoginStatusEnum
import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.common.module.biz.provider.CommonService import com.mogo.och.common.module.biz.provider.CommonService
import com.mogo.och.common.module.biz.skin.SkinManager
import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.skin.Skin
import com.mogo.skin.SkinManager
import com.mogo.skin.SkinManager.SkinLoadListener
import com.mogo.skin.utils.FileUtils
import me.jessyan.autosize.utils.AutoSizeUtils import me.jessyan.autosize.utils.AutoSizeUtils
/** /**
@@ -58,29 +56,9 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback {
override fun init(context: Context) { override fun init(context: Context) {
d(TAG, "FacadeProvider:init__${ProcessUtils.getCurrentProcessName()}_$this") d(TAG, "FacadeProvider:init__${ProcessUtils.getCurrentProcessName()}_$this")
LoginStatusManager.addListener(TAG, this) LoginStatusManager.addListener(TAG, this)
// TODO yangyakun 根据后台配置的用户租户对应的皮肤包进行下载换肤 if(ProjectUtils.isSaas()) {
val skin = Skin( SkinManager.load()
"ee3e1b0ed6e33a51366949294b07787d", }
"YiXin-skin_v1_2024_10_25.zip",
"https://carlife-static-1255510688.cos.ap-beijing.myqcloud.com/MoGoEagleEye/YiXin-skin_v1_2024_10_25.zip"
)
val skinDeQing = Skin(
"a841e8819f06cfefa646f7adc697e070",
"DeQing-skin_v1_2024_10_25.zip",
"https://carlife-static-1255510688.cos.ap-beijing.myqcloud.com/MoGoEagleEye/DeQing-skin_v1_2024_10_25.zip"
)
//换肤
SkinManager.getInstance().downloadSkin(Utils.getApp(), skin, object : SkinLoadListener {
override fun onLoadSuccess() {
//MogoAnalyticUtils.track()
d(TAG,"皮肤下载成功……开始解压Raw下的视频")
FileUtils.copyVideoRawToFile(Utils.getApp(), R.raw::class.java.fields)
}
override fun onLoadFailed(e: java.lang.Exception?) {
}
})
} }
override fun createCoverage(fragmentActivity: FragmentActivity?, integer: Int?): Fragment? { override fun createCoverage(fragmentActivity: FragmentActivity?, integer: Int?): Fragment? {

View File

@@ -0,0 +1,81 @@
package com.mogo.functions.test
import androidx.test.core.app.ActivityScenario
import androidx.test.platform.app.InstrumentationRegistry
import com.mogo.eagle.core.data.enums.Carmodel
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.main.MainLauncherActivity
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.zhidaoauto.map.sdk.open.renders.marker.BitmapDescriptorFactory
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import okio.use
import org.junit.Before
import org.junit.Test
import java.util.concurrent.TimeUnit
class Nt3dByteArrayTest {
companion object {
private const val TAG = "NT3D_TEST"
}
lateinit var launch: ActivityScenario<MainLauncherActivity>
@Before fun before() {
launch = ActivityScenario.launch(MainLauncherActivity::class.java)
}
@Test fun testAllNt3d(): Unit = runBlocking {
val arguments = InstrumentationRegistry.getArguments()
val millis = arguments.getString("delay", "0").toLong()
Logger.d(TAG, "-- testAllNt3d --- 0 ---")
if (millis > 0) {
delay(millis)
}
Logger.d(TAG, "-- testAllNt3d --- 1 ---")
val interval = arguments.getString("interval", "0").toLong()
Carmodel.values().iterator().forEach {
Logger.d(TAG, "-- testAllNt3d --- 2 ---")
delay(interval)
Logger.d(TAG, "-- testAllNt3d --- 3 ---")
BitmapDescriptorFactory.from3DResource(InstrumentationRegistry.getInstrumentation().targetContext, it.rawValue)?.also { data ->
CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(data, true)
}
}
delay(TimeUnit.MINUTES.toMillis(10))
}
@Test fun testAllNt3d2(): Unit = runBlocking {
val arguments = InstrumentationRegistry.getArguments()
val millis = arguments.getString("delay", "0").toLong()
Logger.d(TAG, "-- testAllNt3d2 --- 0 ---")
if (millis > 0) {
delay(millis)
}
Logger.d(TAG, "-- testAllNt3d2 --- 1 ---")
val interval = arguments.getString("interval", "0").toLong()
val step = arguments.getString("step", "0").toInt()
var index = 0
Carmodel.values().iterator().forEach {
Logger.d(TAG, "-- testAllNt3d2 --- 2 ---")
var useByteArray = false
if ((index % step) == 0) {
useByteArray = true
}
delay(interval)
Logger.d(TAG, "-- testAllNt3d2 --- 3 ---:useByteArray -> $useByteArray")
if (useByteArray) {
BitmapDescriptorFactory.from3DResource(InstrumentationRegistry.getInstrumentation().targetContext, it.rawValue)?.also { data ->
CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(data, true)
}
} else {
CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(it.rawValue)
}
index ++
}
delay(TimeUnit.MINUTES.toMillis(10))
}
}

View File

@@ -83,7 +83,7 @@ MOGO_TELEMATIC_VERSION=1.4.7.42
MOGO_SKIN_VERSION=1.4.7.49.18-debug MOGO_SKIN_VERSION=1.4.7.49.18-debug
######## MogoAiCloudSDK Version ######## ######## MogoAiCloudSDK Version ########
# 自研地图 # 自研地图
MAP_SDK_VERSION=3.4.1.18 MAP_SDK_VERSION=3.4.1.19
MAP_SDK_DATA_VERSION=1.0.0.9 MAP_SDK_DATA_VERSION=1.0.0.9
MAP_SDK_OPERATION_VERSION=1.1.4.1 MAP_SDK_OPERATION_VERSION=1.1.4.1
# websocket # websocket

View File

@@ -205,6 +205,17 @@ interface IMogoMapUIController {
*/ */
fun changeCurrentIcon(@RawRes iconId: Int) fun changeCurrentIcon(@RawRes iconId: Int)
/**
* 修改高精地图自车图标
* @param data: 对应的资源的字节数组
* @param is3D:
* 1. true
* 3d资源对应的格式为nt3d, 对应的data也需要为其二进制原始数组
* 2. false
* 对应的是一个图片原始数组
*/
fun changeCurrentIcon(data: ByteArray, is3D: Boolean)
/** /**
* 自研地图是否匹配道路 * 自研地图是否匹配道路
* *

View File

@@ -627,6 +627,27 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle
} }
} }
override fun changeCurrentIcon(data: ByteArray, is3D: Boolean) {
if (checkAMapView()) {
handler.post {
val changeResult = mMapView.getMapAutoViewHelper()!!.getMyLocationStyle()!!
.myLocationIcon(data, is3D)
if (!changeResult) {
val count = reChangeIconCount.incrementAndGet()
MapTraceUtil.log(
"", ChainConstant.CHAIN_CODE_HD_MAP_ICON_SET, TAG,
mapOf("changeCurrentIcon-count" to "$count")
)
if (count >= 3) {
return@post
}
handler.postDelayed({ changeCurrentIcon(data, is3D) }, 300L)
reChangeIconCount.set(0)
}
}
}
}
override fun result(path: String) { override fun result(path: String) {
invokeUploadLogFile(path) invokeUploadLogFile(path)
} }