Merge branch 'refs/heads/dev_robotaxi-d_240912_6.7.0' into dev_robotaxi-d_240912_6.7.2_local

This commit is contained in:
donghongyu-pc
2024-10-17 10:02:36 +08:00
86 changed files with 2115 additions and 330 deletions

View File

@@ -0,0 +1,16 @@
package com.mogo.och.bus.passenger.bean
import com.mogo.eagle.core.data.BaseData
/**
* 网约车小巴路线接口请求响应结果 返回的是对应司机屏的线路信息
*
* @author tongchenfei
*/
data class ResponseSiteIntroduce(val data: MutableList<SiteIntroduceInfo>?) : BaseData(){
data class SiteIntroduceInfo(val siteId:Long,val introduceList:MutableList<IntroduceInfo>)
data class IntroduceInfo(val type:Int,val url :String,val seq:Int)
}

View File

@@ -2,6 +2,7 @@ package com.mogo.och.bus.passenger.model
import android.annotation.SuppressLint
import android.content.Context
import com.mogo.commons.env.ProjectUtils
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
@@ -14,6 +15,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.bus.passenger.bean.PM2RoutesResponse
import com.mogo.och.bus.passenger.bean.ResponseSiteIntroduce
import com.mogo.och.bus.passenger.callback.IAutopilotStatusCallback
import com.mogo.och.bus.passenger.callback.IBusPassegerDriverStatusCallback
import com.mogo.och.bus.passenger.callback.IDrivingInfoCallback
@@ -26,12 +28,14 @@ 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.LoginStatusManager
import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager
import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager
import com.mogo.och.common.module.manager.distance.IDistanceListener
import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.manager.download.DownloadManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.manager.loop.LoopInfo
import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager
@@ -43,6 +47,7 @@ import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.OCHThreadPoolManager
import com.mogo.och.common.module.utils.PinYinUtil
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.data.bean.BusRoutesResult
import com.mogo.och.data.bean.BusStationBean
import com.mogo.och.data.bean.BusTransferData
@@ -202,6 +207,9 @@ object OrderModel {
"onReceivedServerSn = $sn"
)
mDriverStatusCallback?.updateDriverSn(sn)
sn?.let {
querySiteIntroduce()
}
}
}
@@ -213,6 +221,33 @@ object OrderModel {
LanSocketManager.sendMsgToServer(msg)
}
private fun querySiteIntroduce(){
mContext?.let {
if (ProjectUtils.isSaas()) {
BusPassengerServiceManager.querySiteIntroduceBySn(it,object : OchCommonServiceCallback<ResponseSiteIntroduce>{
override fun onSuccess(response: ResponseSiteIntroduce?) {
response?.let {response->
downloadSiteIntroduce(response)
}
}
override fun onFail(code: Int, msg: String?) {
}
})
}
}
}
private fun downloadSiteIntroduce(response: ResponseSiteIntroduce) {
response.data?.forEach {siteIntroduceInfo ->
siteIntroduceInfo.introduceList.forEach {introduceInfo ->
DownloadManager.downloadVideoFile(introduceInfo.url,null)
}
}
}
private fun queryDriverOperationStatus() {
LoginStatusManager.addListener(TAG,object: ILoginCallback{
@@ -319,6 +354,13 @@ object OrderModel {
endStation.longitude = endStationInfo.gcjLon
endStation.latitude = endStationInfo.gcjLat
TrajectoryAndDistanceManager.setStationPoint(startStation, endStation, lineId.toLong())
val introductionList = mutableListOf<MediaItem>()
endStationInfo.videoList.forEach {
if(it.type==1) {
introductionList.add(MediaItem(MediaItem.PrioritySite, it.url,MediaItem.MEDIA_TYPE_VIDEO,"",""))
}
}
MediaManager.postSiteIntroduceInfo(introductionList)
}
fun cleanStation(type: String) {

View File

@@ -6,9 +6,9 @@ import com.mogo.och.bus.passenger.bean.PM2RoutesResponse
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.debug.DebugConfig
import com.mogo.och.bus.passenger.bean.BusPassengerQueryLineRequest
import com.mogo.och.bus.passenger.bean.BusPassengerOperationStatusResponse
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.och.bus.passenger.bean.ResponseSiteIntroduce
import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.network.OchCommonServiceCallback
@@ -51,5 +51,21 @@ object BusPassengerServiceManager {
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverSiteByCoordinate",false))
}
}
/**
* 查询绑定行驶的小巴车路线
* @param context
* @param callback
*/
@JvmStatic
fun querySiteIntroduceBySn(
context: Context, callback: OchCommonServiceCallback<ResponseSiteIntroduce>?
) {
mBusPassengerSaasServiceApi.querySiteIntroduceBySn(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
LoginLanPassengerSocket.driverSn
).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "querySiteIntroduceBySn"))
}
}

View File

@@ -1,8 +1,7 @@
package com.mogo.och.bus.passenger.network;
import com.mogo.och.bus.passenger.bean.BusPassengerOperationStatusResponse;
import com.mogo.och.bus.passenger.bean.BusPassengerQueryLineRequest;
import com.mogo.och.bus.passenger.bean.PM2RoutesResponse;
import com.mogo.och.bus.passenger.bean.ResponseSiteIntroduce;
import io.reactivex.Observable;
import retrofit2.http.Body;
@@ -26,4 +25,12 @@ public interface PassengerSAASServiceApi {
@GET( "/och-bus-cabin/api/business/v1/driver/bus/lineDataWithDriver/query" )
Observable<PM2RoutesResponse> queryDriverSiteByCoordinate(@Header("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
/**
* 查询车辆对应站点的所有视频介绍视频
* @return 接口返回数据
*/
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
@GET( "/och-bus-cabin/api/business/v1/querySiteIntroduceBySn" )
Observable<ResponseSiteIntroduce> querySiteIntroduceBySn(@Header("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
}

View File

@@ -17,6 +17,7 @@ import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
import com.mogo.eagle.core.function.hmi.ui.widget.ColdStartView
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
@@ -43,6 +44,7 @@ import kotlinx.android.synthetic.main.biz_login_view.biz_login_svp
import kotlinx.android.synthetic.main.biz_login_view.bv_switch_business
import kotlinx.android.synthetic.main.biz_login_view.cl_login_info
import kotlinx.android.synthetic.main.biz_login_view.eiv_Info
import kotlinx.android.synthetic.main.biz_login_view.viewColdStart
import me.jessyan.autosize.utils.AutoSizeUtils
@@ -106,56 +108,67 @@ class LoginFragment : MvpFragment<LoginFragment?, LoginPresenter?>(), ILoginView
biz_login_svp.setIsTouchWigetFull(false)
biz_login_svp.enableshowProgressDialog = false
biz_login_svp.enableDoubleClick = false
gsyVideoOptionBuilder.setUrl(videoUrl)
.setCacheWithPlay(false)
.setPlayTag("TaxiPassengerArrivedView")
.build(biz_login_svp)
biz_login_svp.setVideoAllCallBack(object : GSYSampleCallBack() {
override fun onAutoComplete(url: String?, vararg objects: Any?) {
if (AppIdentityModeUtils.isT1T2(FunctionBuildConfig.appIdentityMode)) {
biz_login_svp?.setBackgroundResource(R.drawable.biz_login_bg_taxi_end)
}else{
biz_login_svp?.setBackgroundResource(R.drawable.biz_login_bg_bus_end)
}
viewColdStart.setColdStartResultListener(object: ColdStartView.ColdStartResultListener{
override fun coldStartSuccess() {
gsyVideoOptionBuilder.setUrl(videoUrl)
.setCacheWithPlay(false)
.setPlayTag("TaxiPassengerArrivedView")
.build(biz_login_svp)
}
})
if (showLoginInfoAnimator1 == null) {
showLoginInfoAnimator1 = ObjectAnimator.ofFloat(cl_login_info, "alpha", 0f, 1f)
showLoginInfoAnimator1?.interpolator = LinearInterpolator()
}
if (showLoginInfoAnimator2 == null) {
val dp2px = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(), -50f)
showLoginInfoAnimator2 = ObjectAnimator.ofFloat(cl_login_info, "translationY", 0f, dp2px.toFloat())
showLoginInfoAnimator2?.interpolator = DecelerateInterpolator()
}
UiThreadHandler.postDelayed({
cl_login_info?.let {
val animatorSet = AnimatorSet()
animatorSet.playTogether(showLoginInfoAnimator1, showLoginInfoAnimator2)
animatorSet.duration = 500
animatorSet.addListener(object :AnimatorListener{
override fun onAnimationStart(animation: Animator) {
cl_login_info?.visibility = View.VISIBLE
}
override fun onAnimationEnd(animation: Animator) {
biz_login_svp.setVideoAllCallBack(object : GSYSampleCallBack() {
override fun onAutoComplete(url: String?, vararg objects: Any?) {
if (AppIdentityModeUtils.isT1T2(FunctionBuildConfig.appIdentityMode)) {
biz_login_svp?.setBackgroundResource(R.drawable.biz_login_bg_taxi_end)
}else{
biz_login_svp?.setBackgroundResource(R.drawable.biz_login_bg_bus_end)
}
}
override fun onAnimationCancel(animation: Animator) {
}
override fun onAnimationRepeat(animation: Animator) {
}
})
animatorSet.start()
if (showLoginInfoAnimator1 == null) {
showLoginInfoAnimator1 = ObjectAnimator.ofFloat(cl_login_info, "alpha", 0f, 1f)
showLoginInfoAnimator1?.interpolator = LinearInterpolator()
}
if (showLoginInfoAnimator2 == null) {
val dp2px = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(), -50f)
showLoginInfoAnimator2 = ObjectAnimator.ofFloat(cl_login_info, "translationY", 0f, dp2px.toFloat())
showLoginInfoAnimator2?.interpolator = DecelerateInterpolator()
}
UiThreadHandler.postDelayed({
cl_login_info?.let {
val animatorSet = AnimatorSet()
animatorSet.playTogether(showLoginInfoAnimator1, showLoginInfoAnimator2)
animatorSet.duration = 500
animatorSet.addListener(object :AnimatorListener{
override fun onAnimationStart(animation: Animator) {
cl_login_info?.visibility = View.VISIBLE
}
override fun onAnimationEnd(animation: Animator) {
}
override fun onAnimationCancel(animation: Animator) {
}
override fun onAnimationRepeat(animation: Animator) {
}
})
animatorSet.start()
}
},2_000,UiThreadHandler.MODE.QUEUE)
biz_login_svp.startPlayLogic()
}
},2_000,UiThreadHandler.MODE.QUEUE)
override fun coldStartFail() {
}
})
}
inputPhoneNormal()
@@ -304,7 +317,6 @@ class LoginFragment : MvpFragment<LoginFragment?, LoginPresenter?>(), ILoginView
biz_cl_driver_main?.viewTreeObserver?.addOnGlobalLayoutListener(onlayoutListener)
super.onResume()
CallerLogger.d(TAG, "onResume")
biz_login_svp.startPlayLogic()
}
override fun onPause() {

View File

@@ -180,4 +180,14 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.mogo.eagle.core.function.hmi.ui.widget.ColdStartView
android:id="@+id/viewColdStart"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -15,8 +15,5 @@
<string name="network_error_tip">网络异常,请稍后重试</string>
<string name="request_error_tip">请求出现异常,请稍后重试</string>
<string name="qr_cancel">取消</string>
<string name="bind_driver_qr_title">扫描二维码完成车辆绑定</string>
<string name="biz_log_i_see">我知道了</string>
</resources>

View File

@@ -0,0 +1,7 @@
package com.mogo.och.common.module.biz.media
import com.mogo.och.common.module.wigets.media.MediaItem
interface IMediaDispatch {
fun diapatchMedia(list :MutableList<MediaItem>)
}

View File

@@ -0,0 +1,15 @@
package com.mogo.och.common.module.biz.media
import com.mogo.och.common.module.utils.CallerBase
import com.mogo.och.common.module.wigets.media.MediaItem
object MediaManager : CallerBase<IMediaDispatch>() {
fun postSiteIntroduceInfo(list: MutableList<MediaItem>){
M_LISTENERS.forEach {
val listener = it.value
listener.diapatchMedia(list)
}
}
}

View File

@@ -143,6 +143,16 @@ object OchAutoPilotStatusListenerManager : CallerBase<IOchAutopilotStatusListene
TrajectoryManager.removeDownLoadSuccessLine(lineId)
}
}
when (guardianInfo?.code) {
MogoReport.Code.Error.EMAP.TRA_LOAD_FAILED -> {
OchChainLogManager.writeChainLog("轨迹监控","onAutopilotGuardian() 加载轨迹文件失败", true, OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY)
}
MogoReport.Code.Error.EMAP.TRA_NOT_EXIST -> {
OchChainLogManager.writeChainLog("轨迹监控","onAutopilotGuardian() 无法找到轨迹文件", true, OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY)
}
else -> {}
}
M_LISTENERS.forEach {
val listener = it.value
listener.onAutopilotGuardian(guardianInfo)

View File

@@ -12,6 +12,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.DateTimeUtils
import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager
import com.mogo.och.common.module.manager.autopilot.autopilot.bean.SessionWithTime
import com.mogo.och.common.module.manager.autopilot.line.LineManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.utils.RxUtils
@@ -209,6 +210,7 @@ object OchAutopilotAnalytics {
RxUtils.disposeSubscribe(timeOutDisposable)
timeOutDisposable = RxUtils.createSubscribe(LOOP_PERIOD_15S) {
triggerStartAutopilotFailureEvent("", "15s后app等待超时", System.currentTimeMillis())
LineManager.invokeStartAutopilotTimeOut()
}
}
}

View File

@@ -8,9 +8,11 @@ import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLi
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.och.OchInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener
import com.mogo.eagle.core.function.call.map.CallerMapGlobalTrajectoryDrawManager
import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
@@ -77,6 +79,10 @@ object LineManager : CallerBase<ILineCallback>() {
private var autopilotId: String by Delegates.observable("") { _, oldValue, newValue ->
if (oldValue != newValue) {
CallerEagleBaseFunctionCall4OchManager.setOchAutopilotOrderId(newValue)
getStations { start, end ->
CallerDataCenterBizListener.invokeOchInfo(OchInfo(0, mutableListOf(start.toMogoLocation(),end.toMogoLocation())))
}
}
}

View File

@@ -0,0 +1,172 @@
package com.mogo.och.common.module.manager.download
import android.annotation.SuppressLint
import android.content.Context
import android.os.Environment
import android.text.TextUtils
import android.util.Log
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.download.DownloadUtils
import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener
import com.mogo.eagle.core.utilcode.util.EncryptUtils
import com.mogo.eagle.core.utilcode.util.RegexUtils
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.manager.loop.LoopInfo
import com.mogo.och.common.module.utils.FileUtils
import io.reactivex.schedulers.Schedulers
import java.io.File
@SuppressLint("StaticFieldLeak")
object DownloadManager {
private const val TAG = "DownloadManager"
private val waitDownLoadList = mutableListOf<OchDownLoad>()
private val context: Context?=AbsMogoApplication.getApp()
init {
BizLoopManager.setLoopFunction(TAG, LoopInfo(5*60, ::go2Download, scheduler = Schedulers.io()))
}
/**
* 获取本地缓存文件的文件全路径
*/
private fun getFileCacheDir(): String {
// 有些手机需要通过自定义目录
val relativePath = "mogo" + File.separator + "media" + File.separator
val cacheDir = File(Environment.getExternalStorageDirectory(), relativePath)
if (com.mogo.eagle.core.utilcode.util.FileUtils.createOrExistsDir(cacheDir)) {
return cacheDir.absolutePath
}
return FileUtils.getCacheDirectory(context, "") + relativePath
}
/**
* 本地是否已经存在下载完成的文件
*/
private fun isLocalCacheFileExists(mediaUrl: String): Boolean {
val localVideoCacheFilePath =
getCacheFileFullPathByUrl(mediaUrl)
Log.e(TAG, "文件是否存在mediaUrl=$mediaUrl------本地文件:${localVideoCacheFilePath}")
return com.mogo.eagle.core.utilcode.util.FileUtils.isFileExists(localVideoCacheFilePath)
}
/**
* 获取文件缓存的缓存path, 文件名以base64编码避免 中文命名,重复文件名的影响
*/
private fun getCacheFileFullPathByUrl(mediaUrl: String): String {
return getFileCacheDir() +File.separator +getCacheFileName(mediaUrl)
}
/**
* 本地缓存文件的文件名md5编码避免文件名重复或者特殊字符编码问题
*/
private fun getCacheFileName(mediaUrl: String): String {
val fileSuffix = FileUtils.getExtension(mediaUrl)
if (TextUtils.isEmpty(fileSuffix)) {
Log.e(TAG, "getCacheFileName 根据url获取文件后缀不合法mediaUrl=$mediaUrl")
return ""
}
return EncryptUtils.encryptMD5ToString(mediaUrl) + FileUtils.EXTENSION_SEPARATOR + fileSuffix
}
fun clearLocalFile(localVideoPath:String) {
if (com.mogo.eagle.core.utilcode.util.FileUtils.isFileExists(localVideoPath)) {
com.mogo.eagle.core.utilcode.util.FileUtils.delete(localVideoPath)
}
OchChainLogManager.writechainLogDownload("删除本地文件","localVideoPath:${localVideoPath}")
}
fun downloadVideoFile(mediaUrl: String, listener: IDownloadListener?) {
if (!RegexUtils.isURL(mediaUrl)) {
OchChainLogManager.writechainLogDownload("准备下载","url 错误 ${mediaUrl}")
return
}
val downloadUrl = mediaUrl
val downloadDir = getFileCacheDir()
val downloadFileName = getCacheFileName(mediaUrl)+"_temp"
waitDownLoadList.add(OchDownLoad(downloadUrl,downloadDir,downloadFileName,listener))
if(waitDownLoadList.size==1){
go2Download()
}
}
private fun go2Download(){
if(waitDownLoadList.isEmpty()){
return
}
val first = waitDownLoadList.first()
// 临时文件存在 需要删除重新下载
if (com.mogo.eagle.core.utilcode.util.FileUtils.isFileExists(first.downloadDir+File.separator+first.downloadFileName)) {
OchChainLogManager.writechainLogDownload("删除临时文件","文件名称:${first.downloadDir+File.separator+first.downloadFileName}")
clearLocalFile(first.downloadDir+File.separator+first.downloadFileName)
}
// 改名后文件存在 不需要下载
if(isLocalCacheFileExists(first.downloadUrl)){
if(waitDownLoadList.size>0) {
waitDownLoadList.removeFirst()
}
OchChainLogManager.writechainLogDownload("取消下载文件已存在","信息:${first}")
go2Download()
return
}
OchChainLogManager.writechainLogDownload("准备下载","信息:${first}")
DownloadUtils.downLoad(
context,
first.downloadUrl,
first.downloadDir,
first.downloadFileName,
object :IDownloadListener{
override fun onStart(url: String) {
OchChainLogManager.writechainLogDownload("开始下载","url:${url}")
first.listener?.onStart(url)
}
override fun onProgress(url: String, downloaded: Long, total: Long) {
first.listener?.onProgress(url,downloaded,total)
OchChainLogManager.writechainLogDownload("下载中","url:${url}_downloaded${downloaded}_total:${total}",upload = false)
}
override fun onFinished(url: String, path: String) {
OchChainLogManager.writechainLogDownload("下载成功","url:${url}---path:${path}")
if(waitDownLoadList.size>0) {
waitDownLoadList.removeFirst()
}
if(path.endsWith("_temp")){
val tempFile = File(path)
val newName = tempFile.name.replace("_temp","")
com.mogo.eagle.core.utilcode.util.FileUtils.rename(tempFile,newName)
first.listener?.onFinished(url,path.replace("_temp",""))
}
go2Download()
}
override fun onError(url: String, error: String?) {
first.listener?.onError(url,error)
OchChainLogManager.writechainLogDownload("下载错误","url:${url}---error:${error}")
clearLocalFile(first.downloadDir+File.separator+first.downloadFileName)
if(first.downLoadCount>=5){
OchChainLogManager.writechainLogDownload("下载错误5次可终点关注","url:${url}---error:${error}")
if(waitDownLoadList.size>0) {
waitDownLoadList.removeFirst()
}
go2Download()
return
}
first.downLoadCount++
go2Download()
}
}
)
}
}

View File

@@ -0,0 +1,6 @@
package com.mogo.och.common.module.manager.download
import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener
import java.util.UUID
data class OchDownLoad(val downloadUrl:String, val downloadDir:String, val downloadFileName:String, val listener: IDownloadListener?, var downLoadCount:Int = 0)

View File

@@ -33,10 +33,16 @@ object OchChainLogManager {
// 网络接口
const val EVENT_KEY_INFO_Net = "event_key_och_net"
// 下载日志
const val EVENT_KEY_INFO_Download = "event_key_och_download"
// 初始化信息
const val EVENT_KEY_INFO_INIT = "event_key_och_init"
// 局域网内socket 通讯
const val EVENT_KEY_INFO_SOCKET = "analytics_event_och_track_screen_msg"
// 局域网内socket 连接状态流转
const val EVENT_KEY_INFO_SOCKET_CONNECT = "analytics_event_och_track_screen_connect"
@@ -51,19 +57,23 @@ object OchChainLogManager {
const val EVENT_KEY_INFO_DB = "analytics_event_och_db"
fun writeChainLogDb( title: String, info: String) {
fun writeChainLogDb(title: String, info: String) {
writeChainLog(title, info, true, EVENT_KEY_INFO_DB)
}
fun writeChainLogNet(mustUpdate: Boolean, title: String, info: String) {
if(mustUpdate){
if (mustUpdate) {
writeChainLog(title, info, true, EVENT_KEY_INFO_Net)
}else {
} else {
writeChainLog(title, info, DebugConfig.isDebug(), EVENT_KEY_INFO_Net)
}
}
fun writechainLogDownload(title: String, info: String,upload: Boolean=true) {
writeChainLog(title, info, upload, EVENT_KEY_INFO_Download)
}
fun writeChainLogScanner(title: String, changeInfo: String) {
writeChainLog(title, changeInfo, true, EVENT_KEY_INFO_SCANNER)
}

View File

@@ -0,0 +1,76 @@
package com.mogo.och.common.module.wigets
import android.content.Context
import android.graphics.Bitmap
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.lifecycle.LifecycleObserver
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.och.common.module.R
/**
* 带有title, tip,confirm,cancel的dialog
*/
class BindQRCodeDialogNew: BaseFloatDialog, LifecycleObserver {
private var qrBm : AppCompatImageView? = null
private var qrCancel: AppCompatTextView? = null
private var qrTitle: AppCompatTextView? = null
private var clickListener: ClickListener? = null
constructor(builder: Builder,context: Context) : super(context) {
qrTitle?.text = builder.titleStr
qrCancel?.text = builder.cancelStr
qrBm?.setImageBitmap(builder.qrBm)
}
init{
setContentView(R.layout.bind_driver_qr_view)
setCanceledOnTouchOutside(true)
qrTitle = findViewById(R.id.qr_title)
qrBm = findViewById(R.id.qr_bm)
qrCancel = findViewById(R.id.bind_qr_cancel)
qrCancel?.setOnClickListener {
clickListener?.cancel()
dismiss()
}
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
interface ClickListener{
fun cancel()
}
class Builder{
var titleStr:String = ""
var cancelStr:String = ""
var qrBm: Bitmap? = null
fun title(title: String) : Builder{
this.titleStr = title
return this
}
fun cancelStr(cancel: String) : Builder{
this.cancelStr = cancel
return this
}
fun qrBm(bm: Bitmap) : Builder{
this.qrBm = bm
return this
}
fun build(context: Context): BindQRCodeDialogNew? {
return BindQRCodeDialogNew(this,context)
}
}
}

View File

@@ -1,17 +1,21 @@
package com.mogo.och.common.module.wigets
package com.mogo.och.common.module.wigets.dialog
import android.content.Context
import android.graphics.Color
import android.view.View
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import android.view.animation.LinearInterpolator
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.lifecycle.LifecycleObserver
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.R
import com.mogo.och.common.module.utils.ResourcesUtils
import io.reactivex.Observable
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
@@ -28,6 +32,7 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
private var commonTips : TextView? = null
private var countDownTxt: AppCompatTextView? = null
private var commonStatus:AppCompatImageView?=null
private var commonClose:AppCompatImageView?=null
private var clickListener: ClickListener? = null
@@ -35,9 +40,14 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
private var mCountdownValue: Int = 0
private var status:Status = Status.ask
private var showCloseView:Boolean = false
constructor(builder: Builder,context: Context) : super(context) {
@ColorRes
private var cancelTextColor:Int = R.color.white
private var status: Status = Status.ask
constructor(builder: Builder, context: Context) : super(context) {
commonTitle?.text = builder.titleStr
commonTips?.text = builder.tipsStr
commonCancel?.text = builder.cancelStr
@@ -45,6 +55,12 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
countDownTxt?.text = builder.countDownValue.toString()
mCountdownValue = builder.countDownValue
status = builder.statusEnum
showCloseView = builder.showClose
cancelTextColor = builder.cancelTextColor
this.clickListener = builder.clickListener
commonCancel?.setTextColor(ResourcesUtils.getColors(cancelTextColor))
when (status) {
Status.ask -> {
commonStatus?.setImageResource(R.drawable.common_dialog_icon_ask)
@@ -52,6 +68,9 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
Status.loading -> {
commonStatus?.setImageResource(R.drawable.common_dialog_status_loading)
}
Status.success -> {
commonStatus?.setImageResource(R.drawable.common_feedback_success)
}
}
if (mCountdownValue > 0){
@@ -59,6 +78,9 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
}else{
countDownTxt?.visibility = View.GONE
}
if(showCloseView){
commonClose?.visibility = View.VISIBLE
}
}
init{
@@ -72,6 +94,7 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
commonTips = findViewById(R.id.common_dialog_content_new)
countDownTxt = findViewById(R.id.common_count_down_new)
commonStatus = findViewById(R.id.common_dialog_status)
commonClose = findViewById(R.id.common_dialog_close)
commonConfirm?.setOnClickListener{
clickListener?.confirm()
@@ -81,6 +104,10 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
clickListener?.cancel()
dismiss()
}
commonClose?.onClick {
clickListener?.dismiss()
dismiss()
}
}
fun setClickListener(clickListener: ClickListener) {
@@ -88,8 +115,9 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
}
interface ClickListener{
fun confirm()
fun cancel()
fun confirm(){}
fun cancel(){}
fun dismiss(){}
}
override fun onAttachedToWindow() {
@@ -151,35 +179,53 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
var confirmStr:String = ""
var cancelStr:String = ""
var countDownValue: Int = 0
var showClose:Boolean =false
var cancelTextColor:Int = Color.WHITE
var clickListener:ClickListener?=null
fun title(title: String) : Builder{
fun title(title: String) : Builder {
this.titleStr = title
return this
}
fun tips(tips: String) : Builder{
fun tips(tips: String) : Builder {
this.tipsStr = tips
return this
}
fun confirmStr(commit: String) : Builder{
fun confirmStr(commit: String) : Builder {
this.confirmStr = commit
return this
}
fun showClose(show:Boolean):Builder{
this.showClose = show
return this
}
fun cancelTextColor(@ColorRes color: Int): Builder {
this.cancelTextColor = color
return this
}
/**
* 不传倒计时没有 >0 有倒计时
*/
fun countdownValue(value: Int): Builder{
fun countdownValue(value: Int): Builder {
this.countDownValue = value
return this
}
fun cancelStr(cancel: String) : Builder{
fun cancelStr(cancel: String) : Builder {
this.cancelStr = cancel
return this
}
fun clickListener(clickListener: ClickListener): Builder {
this.clickListener = clickListener
return this
}
fun build(context: Context): CommonDialogStatus {
return CommonDialogStatus(this,context)
}
@@ -191,7 +237,7 @@ class CommonDialogStatus: BaseFloatDialog, LifecycleObserver {
}
enum class Status{
ask,loading
ask,loading,success
}
}

View File

@@ -0,0 +1,86 @@
package com.mogo.och.common.module.wigets.dialog
import android.content.Context
import android.view.View
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.lifecycle.LifecycleObserver
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.R
import com.mogo.och.common.module.utils.RxUtils
/**
* loading
*/
class CommonFeedbackDialog : BaseFloatDialog, LifecycleObserver {
private var status: Status = Status.success
private val ivFeedbackStatus:AppCompatImageView by lazy { findViewById(R.id.iv_feedback_status) }
private val tvFeedbackStatusDescribe:AppCompatTextView by lazy { findViewById(R.id.tv_feedback_status_describe) }
private var listener:Listener?=null
private var mRunnable:Runnable= Runnable {
ToastUtils.showLong("超时未响应,请求失败")
}
constructor(builder: Builder, context: Context) : super(context) {
tvFeedbackStatusDescribe.text = builder.titleStr
status = builder.statusEnum
listener = builder.listener
when (status) {
Status.success -> {
ivFeedbackStatus.setImageResource(R.drawable.common_feedback_success)
}
Status.fail -> {
ivFeedbackStatus.setImageResource(R.drawable.common_feedback_fail)
}
}
RxUtils.createSubscribe(1_000) {
hide()
this.listener?.cancel()
}
}
init {
setContentView(R.layout.common_feedback_dialog)
setCanceledOnTouchOutside(false)
}
class Builder{
var statusEnum: Status = Status.success
var titleStr:String = ""
var listener:Listener?=null
fun title(title: String) : Builder{
this.titleStr = title
return this
}
fun listener(listener: Listener) : Builder{
this.listener = listener
return this
}
fun build(context: Context): CommonFeedbackDialog {
return CommonFeedbackDialog(this,context)
}
fun status(ask: Status): Builder {
this.statusEnum = ask
return this
}
}
enum class Status{
success,fail,loading
}
interface Listener{
fun cancel()
}
}

View File

@@ -3,14 +3,24 @@ package com.mogo.och.common.module.wigets.media
data class MediaDataList(val medias: MutableList<MediaItem>)
data class MediaItem(
var priority:Int,
var fileUrl: String,
var fileType: Int,
var coverImageUrl: String,
var title: String
var title: String,
val isTemp:Boolean = false
) {
companion object {
const val MEDIA_TYPE_IMAGE = 1
const val MEDIA_TYPE_VIDEO = 2
const val PriorityConfi = 2
const val PriorityAd = 1
const val PrioritySite = 0
// 站点优先级 0
// 广告优先级 1
// 本地配置是 2
}
fun isImageType(): Boolean {
@@ -20,4 +30,6 @@ data class MediaItem(
fun isVideoType(): Boolean {
return this.fileType == MEDIA_TYPE_VIDEO
}
}

View File

@@ -6,6 +6,7 @@ import android.text.TextUtils
import com.google.gson.reflect.TypeToken
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.debug.DebugConfig
import com.mogo.commons.env.ProjectUtils
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
@@ -73,9 +74,8 @@ object MediaDataSourceManager {
if (!mMediaDataSourceListenerMap.containsKey(tag)) {
mMediaDataSourceListenerMap[tag] = dataSourceListener
}
val isSassProject = isSassProject()
MediaPlayLogger.printInfoLog("init, 初始化环境 isSassProject=$isSassProject")
if (isSassProject) {
MediaPlayLogger.printInfoLog("init, 初始化环境 isSassProject=${ProjectUtils.isSaas()}")
if (ProjectUtils.isSaas()) {
mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getEagleMisUrl()).create(IMediaNetworkApi::class.java)
MediaPlayLogger.printInfoLog("init, 开始检查后台配置数据")
startGetMediaDataSourceLoop()
@@ -265,6 +265,7 @@ data class MediaDataResp(val data: List<MediaData>) : BaseData() {
val rotationItemList = mutableListOf<MediaItem>()
mediaDataList?.forEach {
val rotationItem = MediaItem(
priority = MediaItem.PriorityAd,
fileUrl = if (TextUtils.isEmpty(it.file_path)) "" else "${it.file_path}",
fileType = if (it.file_type == 1) MEDIA_TYPE_VIDEO else MEDIA_TYPE_IMAGE,
coverImageUrl = if (TextUtils.isEmpty(it.cover_path)) "" else "${it.cover_path}",

View File

@@ -7,6 +7,7 @@ import android.util.Log
import com.mogo.eagle.core.utilcode.download.DownloadUtils
import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener
import com.mogo.eagle.core.utilcode.util.EncryptUtils
import com.mogo.och.common.module.manager.download.DownloadManager
import com.mogo.och.common.module.utils.FileUtils
import java.io.File
@@ -58,7 +59,7 @@ object MediaFileCacheManager {
* 获取文件缓存的缓存path, 文件名以base64编码避免 中文命名,重复文件名的影响
*/
fun getCacheFileFullPathByUrl(context: Context, mediaUrl: String): String {
return getFileCacheDir(context) + getCacheFileName(mediaUrl)
return getFileCacheDir(context) +File.separator +getCacheFileName(mediaUrl)
}
/**
@@ -67,22 +68,14 @@ object MediaFileCacheManager {
fun isLocalCacheFileExists(context: Context, mediaUrl: String): Boolean {
val localVideoCacheFilePath =
getCacheFileFullPathByUrl(context, mediaUrl)
Log.e(TAG, "文件是否存在mediaUrl=$mediaUrl------本地文件:${localVideoCacheFilePath}")
return com.mogo.eagle.core.utilcode.util.FileUtils.isFileExists(localVideoCacheFilePath)
}
/**
* 下载文件
*/
fun downloadFile(context: Context, mediaUrl: String, listener: IDownloadListener) {
val downloadUrl = mediaUrl
val downloadDir = getFileCacheDir(context)
val downloadFileName = getCacheFileName(mediaUrl)
DownloadUtils.downLoad(
context,
downloadUrl,
downloadDir,
downloadFileName,
listener
)
fun downloadFile(mediaUrl: String, listener: IDownloadListener) {
DownloadManager.downloadVideoFile(mediaUrl,listener)
}
}

View File

@@ -14,6 +14,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.CountDownTimer
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.wigets.media.MediaLoopPlayView.Companion.IMAGE_COUNT_DOWN_SECONDS
import com.mogo.och.common.module.wigets.media.MediaLoopPlayView.Companion.TAG
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
class MediaLoopPlayView @JvmOverloads constructor(
@@ -47,6 +48,10 @@ class MediaLoopPlayView @JvmOverloads constructor(
pagerAdapter?.setNewMediaData(list)
}
fun setsetHightPriorityMediaItem(list: MutableList<MediaItem>){
pagerAdapter?.setSiteInfortion(list)
}
fun setPause() {
pagerAdapter?.setPause()
}
@@ -81,6 +86,8 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
//新的数据,在轮播下一次切换的时机完成整体数据的更新
private val mNewDataList: MutableList<MediaItem> = mutableListOf()
private var hightPriorityMediaItem: MutableList<MediaItem> = mutableListOf()
private var mLastViewPagerPosition = -1
private var mImageCountDownTimer: CountDownTimer? = null
@@ -111,6 +118,14 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
mNewDataList.addAll(list)
}
fun setSiteInfortion(list: MutableList<MediaItem>){
hightPriorityMediaItem = list
if(list.isEmpty()){
return
}
startPlayHightPriorityMediaItem(false,1)
}
override fun getCount(): Int {
return mDataList.size
}
@@ -144,7 +159,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
mItemViewList.add(imageView)
} else if (item.isVideoType()) {
val videoView = AdvanceVideoView(mContext)
videoView.initVideoUrlData(item.fileUrl, item.coverImageUrl)
videoView.initVideoUrlData(item.fileUrl, item.coverImageUrl,item.priority,item.isTemp)
mItemViewList.add(videoView)
} else {
MediaPlayLogger.printErrorLog( "addItemView 不支持的文件类型:${item.fileType}")
@@ -174,6 +189,125 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
}
}
private fun startPlayHightPriorityMediaItem(isOnVideoError:Boolean,who:Int){
CallerLogger.d(TAG,"检测播放站点介绍:$who")
val currentPosition = mViewPager.currentItem
if(mItemViewList.isEmpty()){
CallerLogger.d(TAG,"view 没有初始化")
return
}
if(hightPriorityMediaItem.size<1){
CallerLogger.d(TAG,"站点视频播放结束没有了")
val currentMediaItem = mDataList[currentPosition]
// 恢复数据 重新播放
when (val itemView = mItemViewList[currentPosition]) {
is AdvanceVideoView -> {
if(itemView.isTempPlayer){
CallerLogger.d(TAG,"删除临时view 和data")
mItemViewList.remove(itemView)
var tempDeleteItem:MediaItem?=null
mDataList.forEach {
if(it.isTemp){
tempDeleteItem = it
}
}
mDataList.remove(tempDeleteItem)
notifyDataSetChanged()
mViewPager.currentItem = 0
mViewPager.setCurrentItem(0, true)
return
}
CallerLogger.d(TAG,"恢复原有视频播放信息${currentMediaItem}")
itemView.onVideoReset()
if (isOnVideoError) {
// 删除上一个缓存的视频
itemView.clearLocalErrorVideo()
}
itemView.initVideoUrlData(currentMediaItem.fileUrl,currentMediaItem.coverImageUrl,currentMediaItem.priority)
itemView.setThumbImageViewVisible()
itemView.startPlayVideo(videoPlayLifecycleCallBack)
}
}
// 播放完高优视频
startLoopPlay()
return
}
val currentMediaItem = hightPriorityMediaItem.first()
when (val itemView = mItemViewList[currentPosition]) {
// 当前正在播放视频
is AdvanceVideoView -> {
MediaPlayLogger.printInfoLog("startPlayHightPriorityMediaItem: AdvanceVideoView, url=${currentMediaItem.fileUrl}")
itemView.onVideoReset()
if (isOnVideoError) {
// 删除上一个缓存的视频
itemView.clearLocalErrorVideo()
}
itemView.initVideoUrlData(currentMediaItem.fileUrl,currentMediaItem.coverImageUrl,currentMediaItem.priority)
itemView.setThumbImageViewVisible()
itemView.startPlayVideo(hightPriorityVideoPlayLifecycleCallBack)
if(hightPriorityMediaItem.size>0) {
hightPriorityMediaItem.removeFirst()
}
}
// 当前正在播放图片
is AdvanceImageView -> {
// 正在播放图片
MediaPlayLogger.printInfoLog("startPlayHightPriorityMediaItem: AdvanceImageView, url=${currentMediaItem.fileUrl}")
// 停止倒计时
cancelImageCountDownTimer()
// 寻找 视频Item
mDataList.forEachIndexed { index, mediaItem ->
// 广告中有视频播放器
if(mediaItem.fileType==MediaItem.MEDIA_TYPE_VIDEO){
mViewPager.post {
mViewPager.currentItem = index
mViewPager.setCurrentItem(index, true)
}
return
}
}
CallerLogger.d(TAG,"没有视频VIew 创建临时View 和data")
// 当前播放列表中没有视频
// TODO: 创建临时view去播放视频
val mediaItem = MediaItem(
MediaItem.PrioritySite,
currentMediaItem.fileUrl,
MediaItem.MEDIA_TYPE_VIDEO,
"",
"",
true
)
mDataList.add(mediaItem)
addItemView(mediaItem)
notifyDataSetChanged()
mViewPager.currentItem = mItemViewList.size-1
mViewPager.setCurrentItem(mItemViewList.size-1, true)
}
else -> {
MediaPlayLogger.printErrorLog("startLoopPlay 不支持的文件类型:${currentMediaItem.fileType}, url=${currentMediaItem.fileUrl}")
}
}
}
private var hightPriorityVideoPlayLifecycleCallBack = object : GSYSampleCallBack() {
override fun onPrepared(url: String?, vararg objects: Any?) {
CallerLogger.d(MediaLoopPlayView.TAG, "onPrepared")
}
override fun onAutoComplete(url: String?, vararg objects: Any?) {
CallerLogger.d(MediaLoopPlayView.TAG, "onAutoComplete")
startPlayHightPriorityMediaItem(false,3)
}
override fun onPlayError(url: String?, vararg objects: Any?) {
super.onPlayError(url, *objects)
CallerLogger.d(MediaLoopPlayView.TAG, "onPlayError, error=${objects}")
startPlayHightPriorityMediaItem(true,4)
}
}
private var videoPlayLifecycleCallBack = object : GSYSampleCallBack() {
override fun onPrepared(url: String?, vararg objects: Any?) {
@@ -245,7 +379,8 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
currentItemView.clearLocalErrorVideo()
}
if (mItemViewList.size == 1) {
currentItemView.startPlay(currentMediaItem.fileUrl)
currentItemView.initVideoUrlData(currentMediaItem.fileUrl,currentMediaItem.coverImageUrl,currentMediaItem.priority)
currentItemView.startPlayVideo(videoPlayLifecycleCallBack)
return
}
}
@@ -303,7 +438,11 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
"onPageScrollStateChanged, state = $state, currentItem = $currentPosition, lastPosition = $mLastViewPagerPosition"
)
if (mItemViewList.size > 1) { //多于1才会循环跳转
startLoopPlay()
if(hightPriorityMediaItem.size>0){
startPlayHightPriorityMediaItem(false,5)
}else {
startLoopPlay()
}
mLastViewPagerPosition = currentPosition
}
}

View File

@@ -15,6 +15,7 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.mogo.och.common.module.R
import com.mogo.och.common.module.wigets.media.MediaFileCacheManager
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.common.module.wigets.media.MediaLoopPlayView
import com.mogo.och.common.module.wigets.media.MediaPlayLogger
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
@@ -37,6 +38,9 @@ class AdvanceVideoView @JvmOverloads constructor(
private var thumbnailImageUrl: String = ""
private var videoUrl: String = ""
private var priority:Int = MediaItem.PrioritySite
var isTempPlayer = false
private set
private val downListener = object : IDownloadListener {
override fun onStart(url: String) {
@@ -61,7 +65,9 @@ class AdvanceVideoView @JvmOverloads constructor(
if (url == videoUrl) {
//下载完成
ThreadUtils.runOnUiThread {
startPlay(Uri.fromFile(File(path)).toString())
if(priority!=MediaItem.PrioritySite) {
startPlay(Uri.fromFile(File(path)).toString())
}
}
MediaPlayLogger.printInfoLog("download finished, 开始播放downloadUrl=${videoUrl}")
} else {//如果当前文件不存在再次去下载当前的
@@ -72,7 +78,9 @@ class AdvanceVideoView @JvmOverloads constructor(
if (FileUtils.isFileExists(path)) {
Logger.d(MediaLoopPlayView.TAG, "video play download, had download, startPlay")
ThreadUtils.runOnUiThread {
startPlay(Uri.fromFile(File(path)).toString())
if(priority!=MediaItem.PrioritySite) {
startPlay(Uri.fromFile(File(path)).toString())
}
}
MediaPlayLogger.printInfoLog("download finished, 开始播放downloadUrl=${videoUrl}")
} else {
@@ -116,14 +124,20 @@ class AdvanceVideoView @JvmOverloads constructor(
containerLayout?.addView(videoPlayerView, videoPlayerViewLayoutParams)
}
fun initVideoUrlData(videoUrl: String, thumbnailImageUrl: String,priority:Int,isTempPlayer:Boolean = false) {
this.isTempPlayer = isTempPlayer
initVideoUrlData(videoUrl,thumbnailImageUrl,priority)
}
/**
* 初始化数据
*/
fun initVideoUrlData(videoUrl: String, thumbnailImageUrl: String) {
fun initVideoUrlData(videoUrl: String, thumbnailImageUrl: String,priority:Int) {
// https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357834634/5.m4v
// https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360274126/10.mp4
this.videoUrl = videoUrl
this.thumbnailImageUrl = thumbnailImageUrl
this.priority = priority
}
/**
@@ -132,6 +146,19 @@ class AdvanceVideoView @JvmOverloads constructor(
fun startPlayVideo(onCompletionListener: GSYSampleCallBack) {
//首先根据url检查video是否有已经下载完的本地视频文件
gsyVideoPlayerLifecycleCallback = onCompletionListener
videoPlayerView?.thumbImageView = thumbnailImageView
thumbnailImageView?.setImageResource(R.drawable.video_holder)
thumbnailImageView?.also {
Glide.with(context).asBitmap().load(thumbnailImageUrl)
.apply(
RequestOptions().useUnlimitedSourceGeneratorsPool(true)
.placeholder(R.drawable.video_holder)
.error(R.drawable.video_holder)
.fallback(R.drawable.video_holder)
.centerCrop()
)
.into(it)
}
if (MediaFileCacheManager.isLocalCacheFileExists(context, this.videoUrl)) {
val localVideoCacheFilePath = MediaFileCacheManager.getCacheFileFullPathByUrl(
context, this.videoUrl
@@ -144,19 +171,6 @@ class AdvanceVideoView @JvmOverloads constructor(
MediaLoopPlayView.TAG, "播放视频videoUri=$realUri"
)
} else {
thumbnailImageView?.setImageResource(R.drawable.video_holder)
videoPlayerView?.thumbImageView = thumbnailImageView
thumbnailImageView?.also {
Glide.with(context).asBitmap().load(thumbnailImageUrl)
.apply(
RequestOptions().useUnlimitedSourceGeneratorsPool(true)
.placeholder(R.drawable.video_holder)
.error(R.drawable.video_holder)
.fallback(R.drawable.video_holder)
.centerCrop()
)
.into(it)
}
setThumbImageViewVisible()
startDownLoadVideoFile()
@@ -179,11 +193,7 @@ class AdvanceVideoView @JvmOverloads constructor(
private fun startDownLoadVideoFile() {
//下载视频,下载成功后再播放
MediaPlayLogger.printInfoLog( "startDownLoadVideoFile, downloadUrl=${this.videoUrl}")
MediaFileCacheManager.downloadFile(
context,
videoUrl,
downListener
)
MediaFileCacheManager.downloadFile(videoUrl, downListener)
}
fun clearLocalErrorVideo() {
@@ -199,7 +209,7 @@ class AdvanceVideoView @JvmOverloads constructor(
Logger.d(MediaLoopPlayView.TAG, "startPlay")
gsyVideoPlayerOptionBuilder = GSYVideoOptionBuilder()
gsyVideoPlayerOptionBuilder
?.setUrl(localVideoPath) // "/data/user/0/com.mogo.launcher.f/files/video/"
?.setUrl(localVideoPath) // "/sdcard/mogo/media"
?.setPlayTag(MediaFileCacheManager.getCacheFileName(videoUrl))
?.setCacheWithPlay(false)
?.setThumbPlay(false)

View File

@@ -3,11 +3,19 @@ package com.mogo.och.common.module.wigets.media
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.mvp.Presenter
import com.mogo.eagle.core.function.main.MainMoGoApplication
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.R
import com.mogo.och.common.module.biz.media.IMediaDispatch
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.manager.download.DownloadManager
import com.mogo.och.common.module.utils.RxUtils
import com.shuyu.gsyvideoplayer.GSYVideoManager
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.fragment_video_player.acb_add_site_video
import kotlinx.android.synthetic.main.fragment_video_player.imageVideoRotationView
/**
@@ -15,7 +23,7 @@ import kotlinx.android.synthetic.main.fragment_video_player.imageVideoRotationVi
* @date: 2022/4/12
*/
class MediaPlayerFragment :
MvpFragment<MediaPlayerFragment?, MediaPlayerPresenter?>() {
MvpFragment<MediaPlayerFragment?, MediaPlayerPresenter?>(), IMediaDispatch {
companion object {
private val TAG = MediaPlayerFragment::class.java.simpleName
@@ -36,6 +44,13 @@ class MediaPlayerFragment :
}
override fun initViews() {
acb_add_site_video.onClick {
val siteList = mutableListOf<MediaItem>()
// siteList.add(MediaItem(MediaItem.PrioritySite,"https://img.zhidaozhixing.com/fileServer/defaultPath/b47f361c3de6ea490f3086407fc0376f/a1%E8%B7%AF%E7%BA%BF%281%29.mp4",MediaItem.MEDIA_TYPE_VIDEO,"","title"))
siteList.add(MediaItem(MediaItem.PrioritySite,"https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357557335/3.mp4",MediaItem.MEDIA_TYPE_VIDEO,"","title"))
setHightPriorityMediaItem(siteList)
}
MediaManager.addListener(TAG,this)
MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext)
MediaDataSourceManager.init(TAG, object : IMediaDataSourceListener {
override fun onMediaDataSourceChanged(list: List<MediaItem>) {
@@ -56,6 +71,22 @@ class MediaPlayerFragment :
})
}
fun setHightPriorityMediaItem(list: MutableList<MediaItem>){
context?.let {context->
val cacheList = list.filter {
if(!MediaFileCacheManager.isLocalCacheFileExists(context,it.fileUrl)){
DownloadManager.downloadVideoFile(it.fileUrl,null)
}
MediaFileCacheManager.isLocalCacheFileExists(context,it.fileUrl)
}
ThreadUtils.runOnUiThread {
imageVideoRotationView.setsetHightPriorityMediaItem(cacheList.toMutableList())
}
}
}
override fun onPause() {
super.onPause()
imageVideoRotationView.setPause()
@@ -69,8 +100,19 @@ class MediaPlayerFragment :
override fun onDestroy() {
MediaDataSourceManager.unInit(TAG)
GSYVideoManager.releaseAllVideos()
MediaManager.removeListener(TAG)
super.onDestroy()
}
private var fisrtData: Disposable? = null
override fun diapatchMedia(list: MutableList<MediaItem>) {
if(RxUtils.isNotDisposed(fisrtData)){
return
}
fisrtData = RxUtils.createSubscribe(3_000) {}
setHightPriorityMediaItem(list)
}
}
class MediaPlayerPresenter(view: MediaPlayerFragment?) :

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/common_button_cancle_click" android:state_pressed="true"/>
<item android:drawable="@drawable/common_button_cancle_normal" android:state_pressed="false"/>
<item android:drawable="@drawable/common_button_cancle_normal"/>
</selector>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/common_color_99000000"/>
<corners android:radius="@dimen/dp_30"/>
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/common_color_4D000000"/>
<corners android:radius="@dimen/dp_30"/>
</shape>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:startColor="@color/common_3B3D44" android:endColor="@color/common_2E323A" android:angle="270"/>
<stroke android:color="@color/color_666C6C6C" android:width="@dimen/dp_2"/>
<corners android:radius="@dimen/dp_50"/>
</shape>

View File

@@ -1,20 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/dp_890"
android:layout_height="@dimen/dp_780"
<com.mogo.och.common.module.wigets.OCHRoundConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:ignore="MissingDefaultResource"
android:background="@drawable/bind_driver_qr_bg">
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/dp_900"
android:layout_height="@dimen/dp_745"
android:background="@drawable/common_qr_dialog"
app:roundLayoutRadius="@dimen/dp_50">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/qr_title"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bind_driver_qr_title"
android:gravity="center"
android:textSize="@dimen/dp_56"
android:layout_marginTop="@dimen/dp_48"
android:textSize="@dimen/dp_45"
android:layout_marginTop="@dimen/dp_75"
android:textColor="@android:color/white"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
@@ -23,33 +24,27 @@
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/qr_bm"
android:layout_width="@dimen/dp_357"
android:layout_height="@dimen/dp_357"
android:layout_width="@dimen/dp_300"
android:layout_height="@dimen/dp_300"
android:padding="8dp"
android:background="@android:color/white"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/qr_title"
app:layout_constraintBottom_toTopOf="@+id/line"/>
<View
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="2px"
android:background="@color/qr_line_bg_color"
app:layout_constraintBottom_toTopOf="@+id/bind_qr_cancel"
app:layout_constraintLeft_toLeftOf="parent"/>
app:layout_constraintBottom_toTopOf="@+id/bind_qr_cancel"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/bind_qr_cancel"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_162"
android:layout_width="@dimen/dp_356"
android:layout_height="@dimen/dp_120"
android:gravity="center"
android:background="@drawable/common_button_cancle"
android:text="@string/qr_cancel"
android:textSize="@dimen/dp_52"
android:layout_marginBottom="@dimen/dp_65"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:textColor="@android:color/white" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.mogo.och.common.module.wigets.OCHRoundConstraintLayout>

View File

@@ -8,6 +8,16 @@
android:background="@drawable/bg_bone_dialog"
app:roundLayoutRadius="@dimen/dp_50">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/common_dialog_close"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/common_dialog_close"
android:layout_marginEnd="@dimen/dp_50"
android:layout_marginTop="@dimen/dp_50"
android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_60"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/common_dialog_status"
android:layout_width="@dimen/dp_140"

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dp_439"
android:layout_height="@dimen/dp_333"
android:orientation="vertical"
android:gravity="center"
android:layout_gravity="center">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_feedback_status"
android:layout_width="@dimen/dp_140"
android:layout_height="@dimen/dp_140"
android:src="@drawable/common_feedback_success" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_feedback_status_describe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打点成功"
android:textSize="@dimen/dp_38"
android:textColor="@color/white"
android:layout_marginTop="@dimen/dp_28"/>
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -1,10 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- 图片或视频广告-->
<com.mogo.och.common.module.wigets.media.MediaLoopPlayView
android:id="@+id/imageVideoRotationView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/acb_add_site_video"
android:text="添加视频"
android:gravity="center"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="@dimen/dp_100"
android:layout_height="@dimen/dp_30"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -8,7 +8,8 @@
<color name="taxi_111533">#111533</color>
<color name="taxi_878890">#878890</color>
<color name="taxi_EF262C">#EF262C</color>
<color name="taxi_4D000000">#4D000000</color>
<color name="common_color_4D000000">#4D000000</color>
<color name="common_color_99000000">#99000000</color>
<color name="och_dialog_bg_color">#3B4577</color>
@@ -35,4 +36,6 @@
<color name="common_B3FFFFFF">#B3FFFFFF</color>
<color name="common_cccccc">#CCCCCC</color>
<color name="common_f7151d41">#F7151D41</color>
<color name="common_3B3D44">#3B3D44</color>
<color name="common_2E323A">#2E323A</color>
</resources>

View File

@@ -25,7 +25,7 @@
<string name="request_error_tip">请求出现异常,请稍后重试</string>
<string name="qr_cancel">取消</string>
<string name="bind_driver_qr_title">扫描二维码完成车辆绑定</string>
<string name="bind_driver_qr_title">请扫码绑定</string>
<string name="common_change2_autopilot2_manual">自动驾驶已退出,请立即接管,注意周边环境 小心驾驶</string>
<string name="common_change2_pxjs_manual">平行驾驶已退出,请立即接管,注意周边环境 小心驾驶</string>

View File

@@ -1,5 +1,10 @@
package com.mogo.och.data.bean;
import com.mogo.eagle.core.data.map.MogoLocation;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.Objects;
/**
@@ -21,6 +26,7 @@ public class BusStationBean {
private String introduction;// 站点简介
private boolean isPlayTts;
private int pointType; // 1:途径点 2:禁行点 3:站点
private List<SiteIntroduce> videoList;
public String getNameKr() {
return nameKr;
@@ -118,6 +124,14 @@ public class BusStationBean {
isPlayTts = playTts;
}
public List<SiteIntroduce> getVideoList() {
return videoList;
}
public void setVideoList(List<SiteIntroduce> videoList) {
this.videoList = videoList;
}
public int getPointType() {
return pointType;
}
@@ -130,23 +144,40 @@ public class BusStationBean {
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BusStationBean that = (BusStationBean) o;
return siteId == that.siteId
&& seq == that.seq
&& Double.compare(that.gcjLon, gcjLon) == 0
&& Double.compare(that.gcjLat, gcjLat) == 0
&& Double.compare(that.lon, lon) == 0
&& Double.compare(that.lat, lat) == 0
&& Double.compare(gcjLon, that.gcjLon) == 0
&& Double.compare(gcjLat, that.gcjLat) == 0
&& Double.compare(lon, that.lon) == 0
&& Double.compare(lat, that.lat) == 0
&& drivingStatus == that.drivingStatus
&& leaving == that.leaving
&& leaving == that.leaving && isPlayTts == that.isPlayTts
&& pointType == that.pointType
&& name.equals(that.name)
&& (nameKr == null || nameKr.equals(that.nameKr));
&& Objects.equals(name, that.name)
&& Objects.equals(nameKr, that.nameKr)
&& Objects.equals(introduction, that.introduction)
&& Objects.equals(videoList, that.videoList);
}
@Override
public int hashCode() {
return Objects.hash(siteId, name, nameKr, seq, gcjLon, gcjLat, lon, lat, drivingStatus, leaving,pointType);
int result = siteId;
result = 31 * result + Objects.hashCode(name);
result = 31 * result + Objects.hashCode(nameKr);
result = 31 * result + seq;
result = 31 * result + Double.hashCode(gcjLon);
result = 31 * result + Double.hashCode(gcjLat);
result = 31 * result + Double.hashCode(lon);
result = 31 * result + Double.hashCode(lat);
result = 31 * result + drivingStatus;
result = 31 * result + Boolean.hashCode(leaving);
result = 31 * result + Objects.hashCode(introduction);
result = 31 * result + Boolean.hashCode(isPlayTts);
result = 31 * result + pointType;
result = 31 * result + Objects.hashCode(videoList);
return result;
}
@Override
@@ -165,6 +196,15 @@ public class BusStationBean {
", introduction='" + introduction + '\'' +
", isPlayTts=" + isPlayTts +
", pointType=" + pointType +
", videoList=" + videoList +
'}';
}
@NotNull
public MogoLocation toMogoLocation() {
MogoLocation result = new MogoLocation();
result.setLatitude(gcjLat);
result.setLongitude(gcjLon);
return result;
}
}

View File

@@ -0,0 +1,59 @@
package com.mogo.och.data.bean;
import java.util.Objects;
public class SiteIntroduce {
private int type;
private String url;
private int seq;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getSeq() {
return seq;
}
public void setSeq(int seq) {
this.seq = seq;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SiteIntroduce that = (SiteIntroduce) o;
return type == that.type && seq == that.seq && Objects.equals(url, that.url);
}
@Override
public int hashCode() {
int result = type;
result = 31 * result + Objects.hashCode(url);
result = 31 * result + seq;
return result;
}
@Override
public String toString() {
return "SiteIntroduce{" +
"type=" + type +
", url='" + url + '\'' +
", seq=" + seq +
'}';
}
}

View File

@@ -4,6 +4,7 @@ import android.content.Context
import android.view.View
import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.ThreadUtils
@@ -17,6 +18,7 @@ import com.mogo.och.weaknet.repository.db.repository.TaskSiteDb
import com.mogo.och.weaknet.ui.fragment.ShuttleFragment
import com.mogo.och.weaknet.model.LineModel
import com.mogo.och.weaknet.ui.bizswitch.SwitchBizView
import com.mogo.och.weaknet.ui.qr.QrOpenView
import com.mogo.och.weaknet.util.BusAnalyticsManager
/**
@@ -60,4 +62,13 @@ class ShuttleDriverProvider : CommonServiceImpl() {
SwitchBizView(it)
}
}
override fun createOchBindQRCodeView(context: Context?): View? {
if (FunctionBuildConfig.urlJson.bindDriverQRUrl.isNullOrEmpty()) {
return null
}
return context?.let {
QrOpenView(it)
}
}
}

View File

@@ -137,27 +137,7 @@ class ShuttleFragment : MvpFragment<ShuttleFragment?, BusPresenter?>() {
fun changeOverview(eventLogout: EventLogout) {
when (eventLogout.messgae) {
EventLogout.SHOW_QR_TYPE-> { //显示二维码
d(
SceneConstant.M_BUS + TAG, "changeOverview Event qrcodesn = "
+ SharedPrefsMgr.getInstance().sn
)
val qrUrl = String.format(
FunctionBuildConfig.urlJson.bindDriverQRUrl,
SharedPrefsMgr.getInstance().sn
)
val bmQr = createQRCodeWithPicture(
BitmapFactory.decodeResource(resources, R.drawable.icon_qr_center_logo),
qrUrl, AutoSizeUtils.dp2px(context, 340f),
AutoSizeUtils.dp2px(context, 340f), true
)
if (bmQr != null) {
val builder = BindQRCodeDialog.Builder()
builder.title(getString(R.string.bind_driver_qr_title))
.cancelStr(getString(R.string.qr_cancel))
.qrBm(bmQr).build(AbsMogoApplication.getApp())!!.show()
} else {
d(SceneConstant.M_BUS + TAG, "bmQr = null ")
}
}
EventLogout.SHOW_WAIT_UPLOAD_TASK-> {
context?.let {

View File

@@ -0,0 +1,75 @@
package com.mogo.och.weaknet.ui.qr
import android.content.Context
import android.graphics.BitmapFactory
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.utils.createQRCodeWithPicture
import com.mogo.och.common.module.wigets.BindQRCodeDialog
import com.mogo.och.shuttle.weaknet.R
import me.jessyan.autosize.utils.AutoSizeUtils
class QrOpenView : AppCompatImageView {
private val TAG = "QrOpenView"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
context,
attributeSet,
defStyleAttr
)
private fun initView() {
setImageResource(R.drawable.bus_open_qr)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
onClick {
d(
SceneConstant.M_BUS + TAG, "changeOverview Event qrcodesn = "
+ SharedPrefsMgr.getInstance().sn
)
val qrUrl = String.format(
FunctionBuildConfig.urlJson.bindDriverQRUrl,
SharedPrefsMgr.getInstance().sn
)
val bmQr = createQRCodeWithPicture(
BitmapFactory.decodeResource(resources, R.drawable.icon_qr_center_logo),
qrUrl, AutoSizeUtils.dp2px(context, 340f),
AutoSizeUtils.dp2px(context, 340f), true
)
if (bmQr != null) {
val builder = BindQRCodeDialog.Builder()
builder.title(ResourcesUtils.getString(R.string.bind_driver_qr_title))
.cancelStr(ResourcesUtils.getString(R.string.qr_cancel))
.qrBm(bmQr).build(AbsMogoApplication.getApp())!!.show()
} else {
d(SceneConstant.M_BUS + TAG, "bmQr = null ")
}
}
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -12,6 +12,7 @@ import com.mogo.och.weaknet.ui.switchline.SwitchLineAdapter.SwitchLineViewHolder
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import me.jessyan.autosize.AutoSizeCompat
/**
* 路线列表adapter
@@ -50,6 +51,7 @@ class SwitchLineAdapter(
override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) {
val currentPosition = holder.bindingAdapterPosition
AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources)
val line = mData[currentPosition]
holder.lineName.text = line.lineName

View File

@@ -13,6 +13,7 @@ import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.weaknet.ui.switchtask.SwitchLineTaskAdapter.SwitchLineTaskViewHolder
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import me.jessyan.autosize.AutoSizeCompat
/**
* 路线列表adapter
@@ -49,6 +50,7 @@ class SwitchLineTaskAdapter(
override fun onBindViewHolder(holder: SwitchLineTaskViewHolder, position: Int) {
val currentPosition = holder.bindingAdapterPosition
AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources)
val task = mData[currentPosition]
val taskStartTime = TimeUtils.millis2String(task.taskStartTime?:System.currentTimeMillis(), "HH:mm")
holder.taskTime.text = taskStartTime

View File

@@ -6,9 +6,7 @@ import android.view.LayoutInflater
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.manager.loop.BizLoopManager
@@ -52,7 +50,7 @@ class SwitchTaskView: WindowRelativeLayout, SwtichTaskModel.SwtichLineViewCallba
private lateinit var mAdapter: SwitchLineTaskAdapter
private lateinit var linearLayoutManager:LinearLayoutManager
private lateinit var linearLayoutManager:GridLayoutManager
init {
LayoutInflater.from(context).inflate(R.layout.shuttle_weak_switch_task, this, true)
@@ -60,7 +58,7 @@ class SwitchTaskView: WindowRelativeLayout, SwtichTaskModel.SwtichLineViewCallba
}
private fun initView(){
linearLayoutManager = GridLayoutManager(context, 3)
linearLayoutManager = GridLayoutManager(context, 3)
rv_switch_task.setLayoutManager(linearLayoutManager)
mAdapter = SwitchLineTaskAdapter(context,null, mutableListOf())
rv_switch_task.setAdapter(mAdapter)

View File

@@ -6,13 +6,12 @@ import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.och.common.module.manager.autopilot.line.LineManager
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.wigets.CommonDialogStatus
import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus
import com.mogo.och.common.module.wigets.CommonSlideView
import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager
import com.mogo.och.shuttle.weaknet.R
@@ -26,7 +25,6 @@ import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.actv_runnin
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.bus_task_running_line_name
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.loading_arrive_station
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.rl_running_task_station_list
import me.jessyan.autosize.utils.AutoSizeUtils
class TaskRunningView: ConstraintLayout, TaskRunningModel.SwtichLineViewCallback {

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -5,9 +5,13 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.och.unmanned.taxi.R
import com.mogo.och.unmanned.taxi.bean.PointError
import me.jessyan.autosize.AutoSizeCompat
/**
* Created by yangyakun on 06/06/17.
@@ -42,12 +46,16 @@ class ErrorPointItemAdapter(
override fun onBindViewHolder(holder: TextVH, position: Int) {
val errorInfo = dataList[holder.bindingAdapterPosition]
holder.cbErrorInfo.text = errorInfo.name
holder.cbErrorInfo.isChecked = errorInfo.isCheck
holder.cbErrorInfo.setOnCheckedChangeListener { buttonView, isChecked ->
if(buttonView==holder.cbErrorInfo){
errorInfo.isCheck = isChecked
}
AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources)
if (errorInfo.isCheck) {
holder.cbErrorInfo.setImageResource(R.drawable.taxi_routing_check)
}else{
holder.cbErrorInfo.setImageResource(R.drawable.taxi_routing_uncheck)
}
holder.cbErrorResong.text = errorInfo.name
holder.itemView.onClick {
errorInfo.isCheck = !errorInfo.isCheck
notifyItemChanged(holder.bindingAdapterPosition)
}
}
@@ -56,9 +64,7 @@ class ErrorPointItemAdapter(
}
inner class TextVH(itemView: View) : RecyclerView.ViewHolder(itemView) {
var cbErrorInfo: CheckBox
init {
cbErrorInfo = itemView.findViewById(R.id.cb_error_info)
}
var cbErrorInfo: AppCompatImageView = itemView.findViewById(R.id.aciv_show_check_status)
var cbErrorResong: AppCompatTextView = itemView.findViewById(R.id.actv_error_resong)
}
}

View File

@@ -4,6 +4,7 @@ import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.flexbox.AlignItems
import com.google.android.flexbox.FlexDirection
import com.google.android.flexbox.FlexWrap
@@ -14,9 +15,11 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.wigets.WindowRelativeLayout
import com.mogo.och.common.module.wigets.dialog.CommonFeedbackDialog
import com.mogo.och.unmanned.taxi.R
import com.mogo.och.unmanned.taxi.bean.PointError
import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingLoadingDialog
import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.lvs_loding
import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.rvErrorPointReason
import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.tv_report_error_point_reason
import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.tv_report_error_point_reason_cancel
@@ -58,12 +61,6 @@ class ReportErrorPointView : WindowRelativeLayout,
private var occurrenceTime:Long = System.currentTimeMillis()
private val mLoadingDialog: TaxiRoutingLoadingDialog by lazy {
TaxiRoutingLoadingDialog(
context
)
}
private fun initView() {
d(SceneConstant.M_TAXI_P + TAG, "initView")
LayoutInflater.from(context).inflate(R.layout.taxt_report_error_point_panel, this, true)
@@ -73,7 +70,7 @@ class ReportErrorPointView : WindowRelativeLayout,
flexboxLayoutManager.alignItems = AlignItems.CENTER
flexboxLayoutManager.flexWrap = FlexWrap.WRAP
rvErrorPointReason?.layoutManager = flexboxLayoutManager
rvErrorPointReason?.layoutManager = GridLayoutManager(context, 2)
rvErrorPointReason?.setHasFixedSize(true)
errorPointItemAdapter = ErrorPointItemAdapter(
context, mutableListOf(
@@ -91,7 +88,8 @@ class ReportErrorPointView : WindowRelativeLayout,
ToastUtils.showShort("请选择问题类型")
return@onClick
}
mLoadingDialog.showLoading()
tv_report_error_point_reason_cancel.isEnabled = false
lvs_loding.visibility = VISIBLE
this.viewModel?.submitErrorPointReasons(checkDataList,occurrenceTime)
}
}
@@ -101,9 +99,8 @@ class ReportErrorPointView : WindowRelativeLayout,
d(SceneConstant.M_TAXI_P + TAG, "展示---:${isVisible}")
if (isVisible) {
occurrenceTime = System.currentTimeMillis()
tv_work_order_time.text = "时间:${TimeUtils.millis2String(occurrenceTime, TimeUtils.getHourMinSecondFormat())}"
tv_work_order_time.text = TimeUtils.millis2String(occurrenceTime, TimeUtils.getHourMinSecondFormat())
viewModel?.getPointErrorReasons()
mLoadingDialog.showLoading()
} else {
}
@@ -130,7 +127,6 @@ class ReportErrorPointView : WindowRelativeLayout,
}
override fun addViewData(it: MutableList<PointError>) {
mLoadingDialog.hideLoading()
errorPointItemAdapter.setDataList(it)
}
@@ -138,12 +134,23 @@ class ReportErrorPointView : WindowRelativeLayout,
msg?.let {
ToastUtils.showLong(msg)
}
mLoadingDialog.hideLoading()
lvs_loding.visibility = GONE
CommonFeedbackDialog
.Builder()
.title("请重试")
.status(CommonFeedbackDialog.Status.success)
.build(context).show()
}
override fun submitErrorReasons() {
mLoadingDialog.hideLoading()
this.closeCallback?.close()
tv_report_error_point_reason_cancel.isEnabled = true
lvs_loding.visibility = GONE
closeCallback?.close()
CommonFeedbackDialog
.Builder()
.title("打点成功")
.status(CommonFeedbackDialog.Status.success)
.build(context).show()
}
fun setDismiss(listener: CloseCallback) {

View File

@@ -26,6 +26,7 @@ import com.mogo.och.unmanned.taxi.ui.routing.RoutingSwitchModel
import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingFeedbackDialog
import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingModel
import com.mogo.och.common.module.map.MapMakerManager
import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus
import com.mogo.och.unmanned.taxi.utils.TaskUtils
import kotlinx.android.synthetic.main.unmanned_routing_running.view.actv_current_itinerary_end_name
import kotlinx.android.synthetic.main.unmanned_routing_running.view.actv_current_itinerary_start_name
@@ -91,16 +92,16 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal
private fun showFeedbackDialog(grayId: Long) {
val occurrenceTime = System.currentTimeMillis()
val builder: TaxiRoutingFeedbackDialog.Builder = TaxiRoutingFeedbackDialog.Builder()
builder.cancelStr(
MainMoGoApplication.getApp()
.getString(R.string.routing_feedback_result_btn_not_sure)
).confirmStr(
MainMoGoApplication.getApp()
.getString(R.string.routing_feedback_result_btn_sure)
).tips(MainMoGoApplication.getApp().getString(R.string.routing_feedback_result_hint))
.clickListener(object :
TaxiRoutingFeedbackDialog.TaxiRoutingFeedBackDialogClickListener {
CommonDialogStatus
.Builder()
.title("路线验证结束")
.tips("请点击按钮反馈验证结果")
.showClose(true)
.cancelTextColor(R.color.taxi_color_FF4E41)
.cancelStr("线路可用")
.confirmStr("线路不可用")
.status(CommonDialogStatus.Status.success)
.clickListener(object :CommonDialogStatus.ClickListener{
override fun confirm() {
swtichViewModel?.showLoading()
viewModel?.endGrayTask( grayId,
@@ -115,8 +116,36 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal
occurrenceTime)
}
})
mFeedbackDialog = builder.build(context)
mFeedbackDialog?.showDialog()
.build(context).show()
// val builder: TaxiRoutingFeedbackDialog.Builder = TaxiRoutingFeedbackDialog.Builder()
// builder.cancelStr(
// MainMoGoApplication.getApp()
// .getString(R.string.routing_feedback_result_btn_not_sure)
// ).confirmStr(
// MainMoGoApplication.getApp()
// .getString(R.string.routing_feedback_result_btn_sure)
// ).tips(MainMoGoApplication.getApp().getString(R.string.routing_feedback_result_hint))
// .clickListener(object :
// TaxiRoutingFeedbackDialog.TaxiRoutingFeedBackDialogClickListener {
// override fun confirm() {
// swtichViewModel?.showLoading()
// viewModel?.endGrayTask( grayId,
// EndGrayTaskFeedbackType.USABLE_YES,
// occurrenceTime)
// }
//
// override fun cancel() {
// swtichViewModel?.showLoading()
// viewModel?.endGrayTask( grayId,
// EndGrayTaskFeedbackType.USABLE_NO,
// occurrenceTime)
// }
// })
// mFeedbackDialog = builder.build(context)
// mFeedbackDialog?.showDialog()
}
/**

View File

@@ -10,6 +10,7 @@ import androidx.recyclerview.widget.DiffUtil.Callback
import androidx.recyclerview.widget.RecyclerView
import com.mogo.och.unmanned.taxi.R
import com.mogo.och.unmanned.taxi.bean.GrayLineBean
import me.jessyan.autosize.AutoSizeCompat
/**
* 路线列表adapter
@@ -49,6 +50,7 @@ class RoutingItemAdapter(
override fun onBindViewHolder(holder: RoutingItemViewHolder, position: Int) {
val currentPosition = holder.bindingAdapterPosition
val routing = mData[currentPosition]
AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources)
holder.routingName.text = routing.lineName
holder.todayVerifyNum.text = "今日验证:${routing.carVerificationCount}"

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,19 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/cb_error_info"
android:button="@null"
android:text="原因"
android:layout_margin="@dimen/dp_10"
android:paddingStart="@dimen/dp_40"
android:paddingEnd="@dimen/dp_40"
android:paddingTop="@dimen/dp_14"
android:paddingBottom="@dimen/dp_14"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
tools:background="@color/result_points"
android:layout_height="@dimen/dp_90">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aciv_show_check_status"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:src="@drawable/taxi_routing_uncheck"
android:layout_width="@dimen/dp_53"
android:layout_height="@dimen/dp_53"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_error_resong"
app:layout_constraintTop_toTopOf="@+id/aciv_show_check_status"
app:layout_constraintBottom_toBottomOf="@+id/aciv_show_check_status"
app:layout_constraintStart_toEndOf="@+id/aciv_show_check_status"
app:layout_constraintEnd_toEndOf="parent"
android:maxLines="2"
android:ellipsize="end"
android:lineSpacingMultiplier="0.7"
android:layout_marginStart="@dimen/dp_30"
tools:text="绕路绕路绕路绕路绕绕路绕路绕路绕路绕绕路绕路绕路绕路绕绕路绕路绕路绕路绕绕路绕路绕路绕路绕绕路绕路绕路绕路绕"
android:textColor="@color/white"
android:background="@drawable/taxi_error_point_reason_bg"
android:layout_width="wrap_content"
android:textSize="@dimen/dp_36"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,105 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.mogo.och.common.module.wigets.OCHRoundConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="@dimen/dp_844"
android:layout_height="wrap_content"
android:background="@drawable/taxi_error_point_report_bg">
<View
android:id="@+id/view_title_bg"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_102"
android:background="@drawable/taxi_error_point_head_bg"
app:layout_constraintTop_toTopOf="parent" />
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/dp_900"
android:layout_height="@dimen/dp_730"
android:background="@drawable/common_qr_dialog"
app:roundLayoutRadius="@dimen/dp_50">
<TextView
android:id="@+id/tv_report_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_33"
android:text="问题上报"
android:text="线路问题打点"
android:textColor="@color/white"
android:textSize="@dimen/sp_34"
android:textSize="@dimen/sp_45"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/view_title_bg"
app:layout_constraintStart_toStartOf="@id/view_title_bg"
app:layout_constraintTop_toTopOf="@+id/view_title_bg" />
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_51"
/>
<TextView
android:id="@+id/tv_work_order_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_31"
android:layout_marginEnd="@dimen/dp_67"
android:text="时间"
android:textColor="@color/white"
android:textSize="@dimen/sp_30"
app:layout_constraintBottom_toBottomOf="@id/view_title_bg"
app:layout_constraintEnd_toEndOf="@id/view_title_bg"
app:layout_constraintTop_toTopOf="@id/view_title_bg" />
<View
android:id="@+id/view_type_label"
android:layout_width="@dimen/dp_6"
android:layout_height="@dimen/dp_29"
android:layout_marginStart="@dimen/dp_33"
android:layout_marginTop="@dimen/dp_40"
android:background="#FF0176FF"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_title_bg" />
<TextView
android:id="@+id/tv_type_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_13"
android:text="问题类型"
android:textColor="@color/white"
android:textSize="@dimen/sp_32"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/view_type_label"
app:layout_constraintLeft_toRightOf="@id/view_type_label"
app:layout_constraintTop_toTopOf="@id/view_type_label" />
app:layout_constraintTop_toTopOf="@+id/tv_report_title"
app:layout_constraintBottom_toBottomOf="@+id/tv_report_title"
app:layout_constraintEnd_toEndOf="parent"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvErrorPointReason"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_23"
android:layout_marginTop="@dimen/dp_6"
android:layout_marginEnd="@dimen/dp_23"
app:layout_constraintHeight_min="@dimen/dp_140"
app:layout_constraintTop_toBottomOf="@+id/tv_type_title" />
android:layout_height="@dimen/dp_0"
android:layout_marginStart="@dimen/dp_65"
android:layout_marginTop="@dimen/dp_56"
android:layout_marginEnd="@dimen/dp_65"
android:layout_marginBottom="@dimen/dp_10"
app:layout_constraintBottom_toTopOf="@+id/tv_report_error_point_reason"
app:layout_constraintTop_toBottomOf="@+id/tv_report_title" />
<TextView
android:id="@+id/tv_report_error_point_reason"
android:layout_width="@dimen/dp_370"
android:layout_height="@dimen/dp_80"
android:layout_marginTop="@dimen/dp_30"
android:layout_marginBottom="@dimen/dp_40"
android:background="@drawable/taxi_error_point_report_submit_bg"
android:layout_width="@dimen/dp_356"
android:layout_height="@dimen/dp_120"
android:background="@drawable/common_button_cancle"
android:gravity="center"
android:text="上报"
android:textColor="#FFFFFF"
android:textSize="@dimen/sp_27"
android:text="打点"
android:textColor="@color/taxi_color_2eacff"
android:textSize="@dimen/sp_40"
android:textStyle="bold"
android:layout_marginBottom="@dimen/dp_65"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/tv_report_error_point_reason_cancel"
app:layout_constraintTop_toBottomOf="@+id/rvErrorPointReason" />
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="@dimen/dp_65"
/>
<com.mogo.och.common.module.wigets.loading.LoadingViewSmall
android:id="@+id/lvs_loding"
app:layout_constraintTop_toTopOf="@+id/tv_report_error_point_reason"
app:layout_constraintBottom_toBottomOf="@+id/tv_report_error_point_reason"
app:layout_constraintEnd_toEndOf="@+id/tv_report_error_point_reason"
android:layout_marginEnd="@dimen/dp_30"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_report_error_point_reason_cancel"
android:layout_width="@dimen/dp_370"
android:layout_height="@dimen/dp_80"
android:layout_marginBottom="@dimen/dp_40"
android:background="@drawable/taxi_error_point_report_cancle_bg"
android:layout_width="@dimen/dp_356"
android:layout_height="@dimen/dp_120"
android:layout_marginBottom="@dimen/dp_65"
android:background="@drawable/common_button_cancle"
android:layout_marginEnd="@dimen/dp_66"
android:gravity="center"
android:text="取消"
android:textColor="#FFFFFF"
android:textSize="@dimen/sp_27"
android:textSize="@dimen/sp_40"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/tv_report_error_point_reason"
app:layout_constraintRight_toRightOf="parent" />
app:layout_constraintEnd_toEndOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.mogo.och.common.module.wigets.OCHRoundConstraintLayout>

View File

@@ -161,6 +161,10 @@ android {
packagingOptions {
exclude 'META-INF/io.netty.versions.properties'
doNotStrip '*/armeabi-v7a/*.so'
doNotStrip '*/armeabi/*.so'
doNotStrip '*/x86_64/*.so'
doNotStrip '*/x86/*.so'
}
useLibrary 'android.test.runner'
@@ -201,8 +205,7 @@ dependencies {
compileOnly rootProject.ext.dependencies.serialport
}
// implementation rootProject.ext.dependencies.mogocustommap
implementation project(':libraries:mapmodule')
implementation rootProject.ext.dependencies.mogocustommap
implementation project(':core:function-impl:mogo-core-function-startup')
implementation project(':core:function-impl:mogo-core-function-devatools')

View File

@@ -6,60 +6,70 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357256102/1.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "1"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357382357/2.png",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "2"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357557335/3.mp4",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357382357/2.png",
"priority": 2,
"title": "3"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "4"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357834634/5.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"priority": 2,
"title": "5"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676358660379/6.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"priority": 2,
"title": "6"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360154589/7.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "7"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360185500/8.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "8"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360224773/9.png",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "9"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360274126/10.mp4",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360224773/9.png",
"priority": 2,
"title": "10"
}
]
@@ -70,12 +80,14 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov",
"fileType": 2,
"coverImageUrl": "",
"priority": 2,
"title": "1"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov",
"fileType": 2,
"coverImageUrl": "",
"priority": 2,
"title": "2"
}
]
@@ -86,24 +98,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"priority": 2,
"title": "蘑菇车联牵手成都大运会"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969511280/车队.png",
"priority": 2,
"title": "蘑菇车联覆盖生活的方方面面"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"priority": 2,
"title": "蘑菇车联之红旗车队"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"priority": 2,
"title": "多视角体验蘑菇车联自动驾驶"
}
]
@@ -114,24 +130,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"priority": 2,
"title": "蘑菇车联牵手成都大运会"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969511280/车队.png",
"priority": 2,
"title": "蘑菇车联覆盖生活的方方面面"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"priority": 2,
"title": "蘑菇车联之红旗车队"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"priority": 2,
"title": "多视角体验蘑菇车联自动驾驶"
}
]
@@ -150,24 +170,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357256102/1.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "1"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357382357/2.png",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "2"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357557335/3.mp4",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357382357/2.png",
"priority": 2,
"title": "3"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "4"
},
{
@@ -180,36 +204,42 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357834634/5.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"priority": 2,
"title": "5"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676358660379/6.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"priority": 2,
"title": "6"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360154589/7.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "7"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360185500/8.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "8"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360224773/9.png",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "9"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360274126/10.mp4",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360224773/9.png",
"priority": 2,
"title": "10"
}
]
@@ -220,12 +250,14 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov",
"fileType": 2,
"coverImageUrl": "",
"priority": 2,
"title": "1"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov",
"fileType": 2,
"coverImageUrl": "",
"priority": 2,
"title": "2"
}
]
@@ -236,24 +268,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"priority": 2,
"title": "蘑菇车联牵手成都大运会"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969511280/车队.png",
"priority": 2,
"title": "蘑菇车联覆盖生活的方方面面"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"priority": 2,
"title": "蘑菇车联之红旗车队"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"priority": 2,
"title": "多视角体验蘑菇车联自动驾驶"
}
]
@@ -264,24 +300,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"priority": 2,
"title": "蘑菇车联牵手成都大运会"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969511280/车队.png",
"priority": 2,
"title": "蘑菇车联覆盖生活的方方面面"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"priority": 2,
"title": "蘑菇车联之红旗车队"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"priority": 2,
"title": "多视角体验蘑菇车联自动驾驶"
}
]
@@ -294,12 +334,14 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681210971943/yangmadou.mp4",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1680774790614/yangmadao_photo.jpg",
"priority": 2,
"title": "1"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681210971943/yangmadou.mp4",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1680774790614/yangmadao_photo.jpg",
"priority": 2,
"title": "2"
}
]
@@ -310,12 +352,14 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov",
"fileType": 2,
"coverImageUrl": "",
"priority": 2,
"title": "1"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov",
"fileType": 2,
"coverImageUrl": "",
"priority": 2,
"title": "2"
}
]
@@ -326,24 +370,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"priority": 2,
"title": "蘑菇车联牵手成都大运会"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969511280/车队.png",
"priority": 2,
"title": "蘑菇车联覆盖生活的方方面面"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"priority": 2,
"title": "蘑菇车联之红旗车队"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"priority": 2,
"title": "多视角体验蘑菇车联自动驾驶"
}
]
@@ -354,24 +402,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"priority": 2,
"title": "蘑菇车联牵手成都大运会"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969511280/车队.png",
"priority": 2,
"title": "蘑菇车联覆盖生活的方方面面"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"priority": 2,
"title": "蘑菇车联之红旗车队"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"priority": 2,
"title": "多视角体验蘑菇车联自动驾驶"
}
]
@@ -384,10 +436,12 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357256102/1.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "1"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357382357/2.png",
"priority": 2,
"fileType": 1,
"coverImageUrl": "",
"title": "2"
@@ -396,48 +450,56 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357557335/3.mp4",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357382357/2.png",
"priority": 2,
"title": "3"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "4"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357834634/5.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"priority": 2,
"title": "5"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676358660379/6.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357598483/4.jpg",
"priority": 2,
"title": "6"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360154589/7.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "7"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360185500/8.jpg",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "8"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360224773/9.png",
"fileType": 1,
"coverImageUrl": "",
"priority": 2,
"title": "9"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360274126/10.mp4",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676360224773/9.png",
"priority": 2,
"title": "10"
}
]
@@ -448,12 +510,14 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov",
"fileType": 2,
"coverImageUrl": "",
"priority": 2,
"title": "1"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1681716116231/6923474a99a1983c9a0410ad3357888d.mov",
"fileType": 2,
"coverImageUrl": "",
"priority": 2,
"title": "2"
}
]
@@ -464,24 +528,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"priority": 2,
"title": "蘑菇车联牵手成都大运会"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969511280/车队.png",
"priority": 2,
"title": "蘑菇车联覆盖生活的方方面面"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"priority": 2,
"title": "蘑菇车联之红旗车队"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"priority": 2,
"title": "多视角体验蘑菇车联自动驾驶"
}
]
@@ -492,24 +560,28 @@
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"priority": 2,
"title": "蘑菇车联牵手成都大运会"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969511280/车队.png",
"priority": 2,
"title": "蘑菇车联覆盖生活的方方面面"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"priority": 2,
"title": "蘑菇车联之红旗车队"
},
{
"fileUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"fileType": 2,
"coverImageUrl": "https://img.zhidaozhixing.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"priority": 2,
"title": "多视角体验蘑菇车联自动驾驶"
}
]

View File

@@ -1,28 +1,35 @@
package com.mogo.launcher.startup
import android.content.Context
import com.autonavi.nge.hdmap.HDMapProvider
import com.google.gson.reflect.TypeToken
import com.mogo.commons.debug.DebugConfig
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.app.UrlConfig
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HdMapBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.config.JunkConfig
import com.mogo.eagle.core.data.deva.chain.ChainConstant
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.ProcessUtils
import com.mogo.eagle.core.utilcode.util.StringUtils
import com.mogo.launcher.BuildConfig
import com.mogo.launcher.R
import com.shuyu.gsyvideoplayer.player.IjkPlayerManager
import com.zhidaoauto.map.sdk.open.MapAutoApi
import com.zhidaoauto.map.sdk.open.MapParams
import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager
import com.zhjt.service.chain.ChainLog
import tv.danmaku.ijk.media.player.IjkMediaPlayer
import java.util.concurrent.atomic.AtomicReference
object ConfigStartUp {
private const val TAG = "ConfigStartUp"
private val redisCallback by lazy { AtomicReference<HDMapProvider.IRedisLoadCallback>()}
@JvmStatic
fun init(context: Context) {
initDebugConfig()
@@ -112,12 +119,78 @@ object ConfigStartUp {
}
val mapParams = MapParams.init()
mapParams.setDebugMode(false)
mapParams.setDebugMode(true)
// 1-使用本地地图数据0-使用在线地图数据
// .setDataFileSource(1)
.setIsRecordLogs(false)
.setCoordinateType(MapParams.COORDINATETYPE_GCJ02)
MapAutoApi.init(context, mapParams)
HDMapProvider.setRedisDataLoadCallback(object : HDMapProvider.IRedisLoadCallback {
override fun onLoginStart(ip: String, port: Int, password: String, dbIndex: Int) {
Logger.d(TAG, "-- onLoginStart --: ip: $ip, port: $port, password: $password, dbIndex: $dbIndex")
onRedisDataLoadRoute(mapOf("onLoginStart" to "ip:$ip, port:$port, password: $password, dbIndex: $dbIndex"))
}
override fun onLoginSuccess() {
Logger.d(TAG, "-- onLoginSuccess --")
onRedisDataLoadRoute(mapOf("onLoginSuccess" to ""))
}
override fun onLoginFailed(error: String?) {
Logger.d(TAG, "-- onLoginFailed($error) --")
onRedisDataLoadRoute(mapOf("onLoginFailed" to "fail_reason:$error"))
}
override fun onReLogin(isCanRetry: Boolean) {
Logger.d(TAG, "-- onReLogin($isCanRetry) --")
onRedisDataLoadRoute(mapOf("onReLogin" to "isCanRetry:$isCanRetry"))
}
override fun onTileLoadStart(layerId: String, tileId: String) {
Logger.d(TAG, "-- onTileLoadStart(layerId: $layerId, tileId: $tileId) --")
onRedisDataLoadRoute(mapOf("onTileLoadStart" to "layerId: $layerId, tileId: $tileId"))
}
override fun onTileLoadFail(layerId: String, tileId: String, error: String) {
Logger.d(TAG, "-- onTileLoadFail(layerId: $layerId, tileId: $tileId, error: $error) --")
onRedisDataLoadRoute(mapOf("onTileLoadFail" to "layerId: $layerId, tileId: $tileId, error: $error"))
}
override fun onTileLoadSuccess(layerId: String, tileId: String) {
Logger.d(TAG, "-- onTileLoadSuccess(layerId: $layerId, tileId: $tileId) --")
onRedisDataLoadRoute(mapOf("onTileLoadSuccess" to "layerId: $layerId, tileId: $tileId"))
}
override fun onTilesLoadStart(layerId: String, tileIds: List<String>) {
Logger.d(TAG, "-- onTilesLoadStart(layerId: $layerId, tileIds: ${tileIds.joinToString(",")}) --")
onRedisDataLoadRoute(mapOf("onTilesLoadStart" to "layerId: $layerId, tileIds: ${tileIds.joinToString(",")}"))
}
override fun onTilesLoadFail(layerId: String, tileIds: List<String>, error: String?) {
Logger.d(TAG, "-- onTilesLoadFail(layerId: $layerId, tileIds: ${tileIds.joinToString(",")}, error: $error) --")
onRedisDataLoadRoute(mapOf("onTilesLoadFail" to "layerId: $layerId, tileIds: ${tileIds.joinToString(",")}, error:$error"))
}
override fun onTilesLoadSuccess(layerId: String, tileIds: List<String>) {
Logger.d(TAG, "-- onTilesLoadSuccess(layerId: $layerId, tileIds: ${tileIds.joinToString(",")}) --")
onRedisDataLoadRoute(mapOf("onTilesLoadSuccess" to "layerId: $layerId, tileIds: ${tileIds.joinToString(",")}"))
}
}.also {
redisCallback.set(it) // 将此回调保存起来只为了在native层的引用不回收因为native层的引用是全局弱引用
})
// HDMapProvider.toggleSystrace(true) // 开启systrace, 此功能默认关闭,只要在开发阶段定位渲染问题时才打开。(前提需要在地图sdk在关键节点进行手动打点后再开启之后使用systrace工具进行抓取trace文件进行分析)
// HDMapProvider.toggleMapDataDebugInfo(true) // 打开地图调试信息的文字展示,此功能也默认关闭,只有在地图测试工具中使用
}
@ChainLog(
linkChainLog = ChainConstant.CHAIN_TYPE_STATUS,
linkCode = ChainConstant.CHAIN_SOURCE_CLOUD,
nodeAliasCode = ChainConstant.CHAIN_CODE_REDIS_DATA_LOAD,
paramIndexes = [0]
)
private fun onRedisDataLoadRoute(extra: Map<String, Any>) {}
}

View File

@@ -153,6 +153,26 @@ subprojects.each {
}
}
subprojects.each {
it.afterEvaluate { itx ->
if (itx.plugins.hasPlugin('com.android.library') || itx.plugins.hasPlugin('com.android.application')) {
def android = itx.extensions.findByName("android")
android.buildTypes {
configureEach { buildType ->
def matchingFallbacks = buildType.matchingFallbacks ?: []
def array = isReleaseBuild() ? ['release', 'debug'] : ['debug', 'release']
array.each { fallback ->
if (!matchingFallbacks.contains(fallback)) {
matchingFallbacks += fallback
}
}
buildType.matchingFallbacks = matchingFallbacks
}
}
}
}
}
boolean isAndroidTestBuild() {
for (String s : gradle.startParameter.taskNames) {
if (s.contains("AndroidTest")) {
@@ -172,5 +192,5 @@ boolean isReleaseBuild() {
}
boolean isJunkDetectEnable() {
return !isReleaseBuild()
return false
}

View File

@@ -113,8 +113,8 @@ class AiRoadMarker {
.rotate(marker.poi_angle.toFloat())
.longitude(marker.poi_lon)
.latitude(marker.poi_lat)
if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType || marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType) {
builder.anchorColor("#D65D5AFF")
if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType) {
builder.anchorColor("#FFBF10")
}
CallerMapUIServiceManager.getOverlayManager()?.showOrUpdatePoint(builder.build())?.let { p ->
if (!markerIds.contains(markerId)) {

View File

@@ -224,4 +224,15 @@ class OfflineMapDialog(context: Context) : BaseFloatDialog(context, TAG) {
}
}, UiThreadHandler.MODE.QUEUE)
}
override fun dismiss() {
super.dismiss()
if (isLoading) {
hmiAction(
"$M_HMI$TAG",
mapOf("dismiss-loading" to "cancel download")
)
mogoMapData.get()?.cancelDownloadCacheData()
}
}
}

View File

@@ -1,15 +1,39 @@
package com.mogo.eagle.core.function.hmi.ui.widget
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.content.Context
import android.os.Build
import android.os.CountDownTimer
import android.text.Html
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoColdStartStateListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerColdStartStateListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.ResourceUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.zhjt.mogo.adas.data.AdasConstants
import kotlinx.android.synthetic.main.view_cold_start.view.ivColdStartStatus
import kotlinx.android.synthetic.main.view_cold_start.view.ivIpcConnectStatus
import kotlinx.android.synthetic.main.view_cold_start.view.ivSsmConnectStatus
import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartContent
import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartNodeState
import kotlinx.android.synthetic.main.view_cold_start.view.tvIpcConnectContent
import kotlinx.android.synthetic.main.view_cold_start.view.tvSsmConnectContent
import kotlinx.android.synthetic.main.view_cold_start.view.tvSystemStartupTitle
import kotlinx.android.synthetic.main.view_cold_start.view.viewColdStartDivider
import kotlinx.android.synthetic.main.view_cold_start.view.viewSsmConnectDivider
import system_master.SsmInfo
import system_master.SystemStatusInfo
import java.lang.StringBuilder
/**
* 冷启动呈现二期
@@ -19,12 +43,31 @@ class ColdStartView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener {
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener,
IMoGoColdStartStateListener {
companion object {
const val TAG = "ColdStartView"
const val LOAD_SSM_WAITING_TIME = 60000L //SSM加载超时等待时间
const val COLD_START_WAITING_TIME = 300000L //冷启动超时等待时间
}
private var ipcConnectStatus = false //连接域控状态,默认是未连接
private var ssmConnectStatus = false //SSM连接状态默认是未连接
private var coldStartStatus = false //冷启动状态,默认是未冷启动成功
private var ipcRotationAnim: ObjectAnimator?= null //域控连接状态动画
private var ssmRotationAnim: ObjectAnimator?= null //SSM连接状态动画
private var connectSSMTimer: CountDownTimer?= null //连接SSM等待倒计时
private var coldStartRotationAnim: ObjectAnimator?= null //冷启动连接状态动画
private var connectColdStartTimer: CountDownTimer?= null //连接冷启动等待倒计时
private val nodeStatusSb = StringBuilder() //冷启动关键节点启动详情
private var coldStartResultListener: ColdStartResultListener ?= null
init {
LayoutInflater.from(context).inflate(R.layout.view_cold_start, this, true)
initView()
@@ -37,33 +80,101 @@ class ColdStartView @JvmOverloads constructor(
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerColdStartStateListenerManager.addListener(TAG,this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerColdStartStateListenerManager.removeListener(TAG)
}
override fun onAutopilotIpcConnectStatusChanged(
status: AdasConstants.IpcConnectionStatus,
reason: String?
){
if(status == AdasConstants.IpcConnectionStatus.CONNECTED){
//域控连接成功
}else{
//域控连接失败
ThreadUtils.runOnUiThread {
ipcConnectStatus = if(status == AdasConstants.IpcConnectionStatus.CONNECTED){
//域控连接成功
if(!ipcConnectStatus){
showIPCConnectSuccessView()
}
true
}else{
//域控连接失败
when(status){
//主动断开连接
AdasConstants.IpcConnectionStatus.DISCONNECTED ->{
showIPCConnectFailView("域控未连接或主动断开连接,建议重启车辆并上报问题")
}
//连接中
AdasConstants.IpcConnectionStatus.CONNECTING ->{
showIPCConnecting()
}
//重连中(定时器)
AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER ->{
showIPCConnecting()
}
//重连中(网络监听)
AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK ->{
showIPCConnecting()
}
//连接异常(鹰眼与域控连接失败、无法连接、非正常断开等)
AdasConstants.IpcConnectionStatus.CONNECT_EXCEPTION ->{
showIPCConnectFailView("域控连接异常建议检查WiFi连接情况及域控是否开机")
}
//非法地址(连接模式为指定地址时:表示当前鹰眼调用连接时传入的域控地址错误或不符合规则【不修改默认配置不会出现此问题】;
// 连接模式为PING模式时表示传入的PING地址列表存在问题
AdasConstants.IpcConnectionStatus.ILLEGAL_ADDRESS ->{
showIPCConnectFailView("非法域控地址,建议重启车辆并上报问题")
}
//正在搜索域控地址
AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS ->{
showIPCConnecting()
}
//找不到可用地址(域控地址列表中的全部地址均无法连通
// 【不修改默认配置的情况下需要排查PAD是否连接车载路由器、工控机是否连接车载路由器、
// 工控机是否开机等】)
AdasConstants.IpcConnectionStatus.NOT_FOUND_ADDRESS ->{
showIPCConnectFailView("找不到域控可用地址,建议检查车载路由器及域控是否开机")
}
//域控证书认证异常
AdasConstants.IpcConnectionStatus.CERTIFICATION_FAILED ->{
showIPCConnectFailView("域控证书认证异常")
}
//心跳超时(连接域控成功后在一段时间内未收到域控任何数据),超时时间:
AdasConstants.IpcConnectionStatus.HEARTBEAT_TIMEOUT ->{
showIPCConnectFailView("心跳超时(连接域控成功后在一段时间内未收到域控任何数据)")
}
//協議不匹配被连接的域控端非WebSocket协议【可能性非常低】
AdasConstants.IpcConnectionStatus.PROTOCOL_MISMATCH ->{
showIPCConnectFailView("协议不匹配")
}
//域控主动断开连接域控主动发起断开WebSocket连接
AdasConstants.IpcConnectionStatus.SERVER_DISCONNECTED ->{
showIPCConnectFailView("域控主动断开连接,建议重启车辆并上报问题")
}
}
false
}
}
}
/**
* 状态查询应答
* @param status 数据
* HQ、M1 MAP350开始弃用其他车型MAP360开始弃用
*/
override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {
ThreadUtils.runOnUiThread {
//SSM连接成功
connectSSMSuccess()
}
}
@@ -74,7 +185,328 @@ class ColdStartView @JvmOverloads constructor(
* @param statusInf 数据
*/
override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) {
ThreadUtils.runOnUiThread {
//SSM连接成功
connectSSMSuccess()
}
}
/**
* 冷启动状态变更上报以及查询状态
*
* @param token 唯一消息ID
* @param timestamp 消息发送时间 单位:毫秒
* @param isQuery 是否是查询 ture查询相应的结果 false表示状态变动域控主动推送
* @param coldStartState 数据 null表示 PadSsmMsg中的消息体为null
*/
override fun onColdStartState(
token: Long,
timestamp: Long,
isQuery: Boolean,
coldStartState: SsmInfo.ColdStartState?
) {
coldStartState?.let {
ThreadUtils.runOnUiThread {
if(it.eventStatus == SsmInfo.CSState.COLD_START_READY){
//冷启动就绪
showColdStartSuccessView()
}
tvColdStartContent.text = getColdStartEventStatus(it.eventStatus)
nodeStatusSb.clear()
it.nodeList.forEach {node->
val nodeDetail = node.nodeName+ " " + getColdStartNodeStatus(node.status)
if(node.status == SsmInfo.NodeStatus.NODE_FAILED || node.status ==SsmInfo.NodeStatus.NODE_TIMEOUT){
nodeStatusSb.append("<font color=\"#FFCD3D\">${nodeDetail}</font>")
}else{
nodeStatusSb.append("<font color=\"#B2FFFFFF\">${nodeDetail}</font>")
}
nodeStatusSb.append("<br>")
}
tvColdStartNodeState.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(nodeStatusSb.toString(), Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(nodeStatusSb.toString())
}
}
}
}
/**
* 冷启动状态
*/
private fun getColdStartEventStatus(state: SsmInfo.CSState): String{
return when(state){
// 未开始
SsmInfo.CSState.COLD_START_DEFAULT->{
"启动中…"
}
// 启动中
SsmInfo.CSState.COLD_START_STARTING->{
"启动中…"
}
// 就绪
SsmInfo.CSState.COLD_START_READY->{
"系统启动成功,即将进入主页"
}
// 有异常未就绪
SsmInfo.CSState.COLD_START_UNREADY->{
"系统启动异常,建议重启车辆并上报问题"
}
// 超时
SsmInfo.CSState.COLD_START_TIMEOUT->{
"系统启动异常,建议重启车辆并上报问题"
}
}
}
/**
* 获取节点启动状态
*/
private fun getColdStartNodeStatus(nodeStatus: SsmInfo.NodeStatus): String{
return when(nodeStatus){
// 启动中
SsmInfo.NodeStatus.NODE_STARTING->{
"启动中…"
}
// 启动成功
SsmInfo.NodeStatus.NODE_FINISH->{
"启动成功"
}
// 启动失败
SsmInfo.NodeStatus.NODE_FAILED->{
"启动失败"
}
// 启动超时
SsmInfo.NodeStatus.NODE_TIMEOUT->{
"启动超时"
}
}
}
/**
* 展示域控连接成功视图
*/
private fun showIPCConnectSuccessView(){
ipcRotationAnim?.cancel()
ivIpcConnectStatus.rotation = 0f
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_in_progress_title)
ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success))
tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_success)
//开启连接SSM倒计时
connectSSMProcess()
//域控连接成功后开始展示SSM连接状态
viewSsmConnectDivider.visibility = View.VISIBLE
ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process))
//旋转动画
ssmRotationAnim = ObjectAnimator.ofFloat(ivSsmConnectStatus, "rotation", 0f, 360f)
ssmRotationAnim?.repeatCount = ValueAnimator.INFINITE
ssmRotationAnim?.repeatMode = ValueAnimator.RESTART
ssmRotationAnim?.duration = 1500
ssmRotationAnim?.interpolator = LinearInterpolator()
ssmRotationAnim?.start()
//设置SSM连接文案为连接中
tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_loading)
tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, android.R.color.white))
viewSsmConnectDivider.visibility = View.VISIBLE
ivSsmConnectStatus.visibility = View.VISIBLE
tvSsmConnectContent.visibility = View.VISIBLE
//隐藏冷启动相关视图
viewColdStartDivider.visibility = View.GONE
ivColdStartStatus.visibility = View.GONE
tvColdStartContent.visibility = View.GONE
}
/**
* 展示域控连接失败视图
*/
private fun showIPCConnectFailView(reason: String?){
if(tvIpcConnectContent.text.isNotEmpty() && tvIpcConnectContent.text.equals(reason)){
return
}
ipcRotationAnim?.cancel()
ivIpcConnectStatus.rotation = 0f
ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_fail))
reason?.let {
tvIpcConnectContent.text = it
}
//隐藏SSM相关视图
viewSsmConnectDivider.visibility = View.GONE
ivSsmConnectStatus.visibility = View.GONE
tvSsmConnectContent.visibility = View.GONE
//隐藏冷启动相关视图
viewColdStartDivider.visibility = View.GONE
ivColdStartStatus.visibility = View.GONE
tvColdStartContent.visibility = View.GONE
}
private fun showIPCConnecting(){
ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process))
tvIpcConnectContent.text = "正在连接域控..."
ipcRotationAnim = ObjectAnimator.ofFloat(ivIpcConnectStatus, "rotation", 0f, 360f)
ipcRotationAnim?.repeatCount = ValueAnimator.INFINITE
ipcRotationAnim?.repeatMode = ValueAnimator.RESTART
ipcRotationAnim?.duration = 1500
ipcRotationAnim?.interpolator = LinearInterpolator()
ipcRotationAnim?.start()
//隐藏SSM相关视图
viewSsmConnectDivider.visibility = View.GONE
ivSsmConnectStatus.visibility = View.GONE
tvSsmConnectContent.visibility = View.GONE
//隐藏冷启动相关视图
viewColdStartDivider.visibility = View.GONE
ivColdStartStatus.visibility = View.GONE
tvColdStartContent.visibility = View.GONE
}
/**
* SSM连接成功
*/
private fun connectSSMSuccess(){
if(!ssmConnectStatus){
showSSMConnectSuccessView()
//取消连接SSM超时等待倒计时
connectSSMTimer?.cancel()
//开始启动冷启动等待倒计时
coldStartProcess()
}
ssmConnectStatus = true
coldStartStatus = false
}
/**
* 展示SSM连接成功视图
*/
private fun showSSMConnectSuccessView(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_in_progress_title)
//取消旋转动画
ssmRotationAnim?.cancel()
//取消连接SSM超时等待倒计时
connectSSMTimer?.cancel()
//展示SSM连接成功视图
ivSsmConnectStatus.rotation = 0f
ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success))
tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_success)
tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, R.color.white))
//展示冷启动连接过程视图
viewColdStartDivider.visibility = View.VISIBLE
ivColdStartStatus.visibility = View.VISIBLE
tvColdStartContent.visibility = View.VISIBLE
tvColdStartContent.text = "启动中…"
ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process))
//开启冷启动连接状态动画
coldStartRotationAnim = ObjectAnimator.ofFloat(ivColdStartStatus, "rotation", 0f, 360f)
coldStartRotationAnim?.repeatCount = ValueAnimator.INFINITE
coldStartRotationAnim?.repeatMode = ValueAnimator.RESTART
coldStartRotationAnim?.duration = 1500
coldStartRotationAnim?.interpolator = LinearInterpolator()
coldStartRotationAnim?.start()
}
/**
* 展示SSM连接失败视图
*/
private fun showSSMConnectFailView(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_fail_title)
//取消旋转动画
ssmRotationAnim?.cancel()
ivSsmConnectStatus.rotation = 0f
ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_fail))
tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_fail)
tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail))
}
/**
* 连接SSM过程
*/
private fun connectSSMProcess(){
ThreadUtils.runOnUiThread {
connectSSMTimer = object: CountDownTimer(LOAD_SSM_WAITING_TIME,LOAD_SSM_WAITING_TIME){
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
//将SSM连接状态置为false
ssmConnectStatus = false
coldStartStatus = false
//取消连接SSM超时等待倒计时
connectSSMTimer?.cancel()
//展示连接SSM失败视图
showSSMConnectFailView()
}
}
connectSSMTimer?.start()
}
}
/**
* 冷启动过程
*/
private fun coldStartProcess(){
ThreadUtils.runOnUiThread {
connectColdStartTimer = object: CountDownTimer(COLD_START_WAITING_TIME,COLD_START_WAITING_TIME){
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
//将冷启动状态置为false
coldStartStatus = false
//展示冷启动失败视图
showColdStartFailView()
}
}
connectColdStartTimer?.start()
}
}
/**
* 冷启动失败视图
*/
private fun showColdStartFailView(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_fail_title)
coldStartRotationAnim?.cancel()
ivColdStartStatus.rotation = 0f
ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_fail))
tvColdStartContent.text = resources.getString(R.string.cold_start_fail_content)
coldStartResultListener?.coldStartFail()
}
/**
* 冷启动成功视图
*/
private fun showColdStartSuccessView(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_success_title)
coldStartRotationAnim?.cancel()
ivColdStartStatus.rotation = 0f
ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success))
tvColdStartContent.text = resources.getString(R.string.cold_start_success_content)
connectColdStartTimer?.cancel()
hideColdStartView()
}
/**
* 隐藏冷启动视图
*/
private fun hideColdStartView(){
UiThreadHandler.postDelayed({
this@ColdStartView.visibility = View.GONE
coldStartResultListener?.coldStartSuccess()
}, 2000)
}
/**
* 冷启动接管监听接口
*/
interface ColdStartResultListener{
fun coldStartSuccess()
fun coldStartFail()
}
fun setColdStartResultListener(listener: ColdStartResultListener){
coldStartResultListener = listener
}
}

View File

@@ -2,7 +2,9 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#7F000000"
>
<TextView
android:id="@+id/tvSystemStartupTitle"
@@ -12,6 +14,9 @@
android:textSize="@dimen/sp_70"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:text="@string/cold_start_in_progress_title"
android:layout_marginTop="@dimen/dp_432"
android:layout_marginStart="@dimen/dp_261"
/>
<ImageView
@@ -21,6 +26,7 @@
app:layout_constraintTop_toBottomOf="@id/tvSystemStartupTitle"
app:layout_constraintLeft_toLeftOf="@id/tvSystemStartupTitle"
android:contentDescription="@string/ipc_connect_icon"
android:layout_marginTop="@dimen/dp_89"
/>
<TextView
@@ -44,6 +50,7 @@
app:layout_constraintTop_toBottomOf="@id/ivIpcConnectStatus"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/bg_cold_start_divider"
android:visibility="invisible"
/>
<ImageView
@@ -54,6 +61,7 @@
app:layout_constraintLeft_toLeftOf="@id/viewSsmConnectDivider"
app:layout_constraintRight_toRightOf="@id/viewSsmConnectDivider"
android:contentDescription="@string/ssm_connect_icon"
android:layout_marginTop="@dimen/dp_5"
/>
<TextView
@@ -77,8 +85,40 @@
app:layout_constraintTop_toBottomOf="@id/ivSsmConnectStatus"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/bg_cold_start_divider"
android:visibility="invisible"
/>
<ImageView
android:id="@+id/ivColdStartStatus"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/viewColdStartDivider"
app:layout_constraintLeft_toLeftOf="@id/viewColdStartDivider"
app:layout_constraintRight_toRightOf="@id/viewColdStartDivider"
android:layout_marginTop="@dimen/dp_5"
android:contentDescription="@string/cold_start_icon"
/>
<TextView
android:id="@+id/tvColdStartContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/ivColdStartStatus"
app:layout_constraintLeft_toRightOf="@id/ivColdStartStatus"
android:textSize="@dimen/sp_36"
android:textColor="@color/white"
android:layout_marginStart="@dimen/dp_15"
/>
<TextView
android:id="@+id/tvColdStartNodeState"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvColdStartContent"
app:layout_constraintLeft_toLeftOf="@id/tvColdStartContent"
android:textSize="@dimen/sp_32"
android:textColor="#B2FFFFFF"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -92,4 +92,6 @@
<color name="auto_exploration_content_p">#131415</color>
<color name="cold_start_fail">#FFCD3D</color>
</resources>

View File

@@ -215,5 +215,15 @@
<string name="ipc_connect_icon">域控连接状态图标</string>
<string name="ssm_connect_icon">SSM连接状态图标</string>
<string name="cold_start_icon">冷启动状态图标</string>
<string name="ipc_connect_success">已连接域控</string>
<string name="cold_start_in_progress_title">系统启动中…</string>
<string name="cold_start_success_title">系统启动成功</string>
<string name="cold_start_fail_title">系统启动失败</string>
<string name="ssm_connect_loading">正在连接SSM…</string>
<string name="ssm_connect_success">已连接SSM</string>
<string name="ssm_connect_fail">SSM连接异常建议重启车辆并上报问题</string>
<string name="cold_start_success_content">系统启动成功,即将进入主页</string>
<string name="cold_start_fail_content">系统启动异常,建议重启车辆并上报问题</string>
</resources>

View File

@@ -2,7 +2,7 @@
<!--android:keyHeight="122dp"
android:keyWidth="237dp"-->
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:keyboard="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:keyHeight="122dp"
android:keyWidth="239dp"
android:horizontalGap="1dp"
@@ -36,7 +36,7 @@
<Key
android:codes="-4"
keyboard:keyBackground="@drawable/keyboard_blue"
app:keyBackground="@drawable/keyboard_blue"
android:keyHeight="368dp"
android:keyLabel="确定"/>
</Row>

View File

@@ -61,8 +61,7 @@ dependencies {
exclude group: 'com.zhidaoauto.machine', module: 'map'
}
// implementation rootProject.ext.dependencies.mogocustommap
implementation project(':libraries:mapmodule')
implementation rootProject.ext.dependencies.mogocustommap
implementation rootProject.ext.dependencies.amapnavi3dmap
implementation rootProject.ext.dependencies.androidxroomruntime

View File

@@ -96,6 +96,7 @@ class ChainConstant {
const val CHAIN_CODE_MAIN_BLOCK = "CHAIN_CODE_MAIN_BLOCK"
const val CHAIN_CODE_DISPATCH_RECEIVE = "CHAIN_CODE_DISPATCH_RECEIVE"
const val CHAIN_CODE_DISPATCH_START = "CHAIN_CODE_DISPATCH_START"
const val CHAIN_CODE_REDIS_DATA_LOAD = "CHAIN_CODE_REDIS_DATA_LOAD"
const val CHAIN_CODE_CLOUD_INIT = "CHAIN_CODE_CLOUD_INIT"
const val CHAIN_CODE_CLOUD_PASSPORT_TOKEN = "CHAIN_CODE_CLOUD_PASSPORT_TOKEN"

View File

@@ -832,7 +832,7 @@ enum class EventTypeEnumNew(
}
TYPE_SOCKET_ROAD_CONGESTION.poiType -> R.raw.v2x_yongdu
TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType -> if (FunctionBuildConfig.skinMode != 0) TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE.traffic3DIconId else TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE.traffic3DNightIconId
TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> if (FunctionBuildConfig.skinMode != 0) TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE.traffic3DIconId else TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE.traffic3DNightIconId
TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> if (FunctionBuildConfig.skinMode != 0) TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE_RETROGRADE.traffic3DIconId else TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE_RETROGRADE.traffic3DNightIconId
else -> 0
}
}

View File

@@ -121,8 +121,18 @@ enum class TrafficTypeEnum(
R.raw.v2x_shigu_sanjiaopai,
R.raw.v2x_shigu_sanjiaopai,
R.raw.v2x_shigu_sanjiaopai
),
TYPE_TRAFFIC_ID_TA_CHE_RETROGRADE(
100062,
"他车逆行",
R.raw.traffic_tachexiaoche_retrograde,
R.raw.traffic_tachexiaoche_retrograde,
R.raw.traffic_tachexiaoche_retrograde
);
companion object {
@JvmStatic
fun getType(type: Int): TrafficTypeEnum {

View File

@@ -0,0 +1,6 @@
package com.mogo.eagle.core.data.och
import com.mogo.eagle.core.data.map.MogoLocation
// type 0-> 起终点坐标 坐标index 0 起点 坐标index 1 终点
data class OchInfo(var type: Int, var latLonList: List<MogoLocation>)

View File

@@ -1,5 +1,8 @@
package com.mogo.eagle.core.function.api.datacenter
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.och.OchInfo
interface IDataCenterBizListener {
fun invokeLoginNo(loginNo:String?){}
@@ -24,4 +27,5 @@ interface IDataCenterBizListener {
fun invokeAutopilotOrderId(orderID:String){}
fun invokeOchInfo(ochInfo: OchInfo) {}
}

View File

@@ -30,7 +30,11 @@ object CallerAutopilotStatisticsListenerManager : CallerBase<IMoGoAutopilotStati
)
} else {
CallerTrace.write("AutopilotStatistics", mapOf("status" to it.status, "failedMessage" to (it.failedMessage?.msg?:""),
"req" to it.req, "usedTime" to it.usedTime,
"reqSource" to it.req.source,
"reqMode" to it.req.mode,
"reqCmdOrderId" to (it.req.cmdInfo.orderId?:""),
"reqCmdFirstFlag" to it.req.cmdInfo.firstAutopilotFlag,
"usedTime" to it.usedTime,
"isDemoMode" to FunctionBuildConfig.isDemoMode,
"isTakeoverRemind" to FunctionBuildConfig.isTakeoverRemind))
}

View File

@@ -1,5 +1,7 @@
package com.mogo.eagle.core.function.call.datacenter
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.och.OchInfo
import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener
import com.mogo.eagle.core.function.call.base.CallerBase
import java.util.concurrent.atomic.AtomicBoolean
@@ -96,6 +98,12 @@ object CallerDataCenterBizListener : CallerBase<IDataCenterBizListener>() {
}
}
fun invokeOchInfo(ochInfo: OchInfo) {
M_LISTENERS.forEach {
it.value.invokeOchInfo(ochInfo)
}
}
fun getOrderId(): String {
return orderId
}

View File

@@ -83,7 +83,7 @@ MOGO_TELEMATIC_VERSION=1.4.7.42
MOGO_SKIN_VERSION=1.4.7.48
######## MogoAiCloudSDK Version ########
# 自研地图
MAP_SDK_VERSION=3.4.1.2
MAP_SDK_VERSION=3.4.1.13_alpha_7
MAP_SDK_DATA_VERSION=1.0.0.9
MAP_SDK_OPERATION_VERSION=1.1.4.1
# websocket

View File

@@ -111,10 +111,10 @@ void setLeadLine(){
}
void setSignalLine(){
if(signalLineObj==1 && signalLineStep>0){
_uv.x = (uv.x - 0.5)*signalScale + 0.5; //x方向缩放
_uv.x = uv.x;
_uv.y = uv.y;
signalLineTexY = _uv.y;
_uv = _uv + vec2(0.0,1.0)*signalLineTime;
_uv = _uv + vec2(0.0,1.0);
}
}
void setGuideLine(){

View File

@@ -1,4 +1,4 @@
package com.autonavi.nge.dm;//package com.autonavi.nge.dm;
//package com.autonavi.nge.dm;
//
//import android.os.RemoteException;
//import android.util.Log;

View File

@@ -1,4 +1,4 @@
package com.autonavi.nge.guidance;//package com.autonavi.nge.guidance;
//package com.autonavi.nge.guidance;
//
//import android.util.Log;
//

View File

@@ -10,11 +10,88 @@ class HDMapProvider {
/**f:设置redis源。1,测试redis42。非1正式redis根据域名访问的。默认,非1 */
@JvmStatic external fun setDataRedisSource(source: Int)
/** 是否开启地图数据调试信息的展示*/
@JvmStatic external fun toggleMapDataDebugInfo(open: Boolean)
/** 是否开启Systrace*/
@JvmStatic external fun toggleSystrace(open: Boolean)
/**
* 设置Redis数据加载回调
*/
@JvmStatic external fun setRedisDataLoadCallback(callback: IRedisLoadCallback)
init {
System.loadLibrary("hdmap")
}
}
interface IRedisLoadCallback {
/**
* 登录开始
*/
fun onLoginStart(ip: String, port: Int, password: String, dbIndex: Int) { }
/**
* 登录失败
*/
fun onLoginFailed(error: String?) { }
/**
* 登录成功
*/
fun onLoginSuccess() { }
/**
* 登录成功之后,重新开始登录
* @param isCanRetry: true -> 可以再次重试; false-> 不可以再次重试
*/
fun onReLogin(isCanRetry: Boolean) { }
/**
* 请求 加载指定瓦片数据 开始
* @param layerId: redis中指哈希表中的键
* @param tileId: 要获取的指定瓦片ID的数据
*/
fun onTileLoadStart(layerId: String, tileId: String) { }
/**
* 请求加载瓦片数据成功
* @param layerId: redis中指哈希表中的键
* @param tileId: 要获取的指定瓦片ID的数据
*/
fun onTileLoadSuccess(layerId: String, tileId: String) { }
/**
* 请求加载瓦片数据失败
* @param layerId: redis中指哈希表中的键
* @param tileId: 要获取的指定瓦片ID的数据
*/
fun onTileLoadFail(layerId: String, tileId: String, error: String) { }
/**
* 请求同时加载多个瓦片数据开始
* @param layerId: redis中指哈希表中的键
* @param tileIds: 要获取的指定瓦片ID列表的集合
*/
fun onTilesLoadStart(layerId: String, tileIds: List<String>) { }
/**
* 同时加载多个瓦片数据成功
* @param layerId: redis中指哈希表中的键
* @param tileIds: 要获取的指定瓦片ID列表的集合
*/
fun onTilesLoadSuccess(layerId: String, tileIds: List<String>) { }
/**
* 同时加载多个瓦片数据失败
* @param layerId: redis中指哈希表中的键
* @param tileIds: 要获取的指定瓦片ID列表的集合
* @param error: 加载失败的异常信息
*/
fun onTilesLoadFail(layerId: String, tileIds: List<String>, error: String?) { }
}
fun getLaneCenterLine(tileId: Int, routeId: Int): ArrayList<HDMapBlock>? {
return if (mObj != 0L) {
getLaneCenterLineJni(mObj, tileId, routeId)

View File

@@ -27,7 +27,7 @@ interface IMarkerController {
/**
* 批量更新他车
*/
fun updateBatchMarkerPositon(batchMarkerOptions: com.zhidaoauto.map.sdk.open.renders.marker.BatchMarkerOptions)
fun updateBatchMarkerPositon(batchMarkerOptions: BatchMarkerOptions)
//根据车辆类型预添加车辆模型
fun addPreVehicleModel(type:Int,modelRes:Int):String?
//添加普通模型

View File

@@ -93,6 +93,9 @@ class RoadHelper private constructor() {
cacheHdDataProgressJob?.cancel()
cacheHdDataProgressJob = null
mHdDataDownloadListener?.clear()
mHdDataDownloadListener = null
cancelCacheHDData()
hdMapProvider.release()

View File

@@ -26,6 +26,8 @@ class MarkerSimpleData {
var color: String = ""
//颜色设置类型 0 直接替换 1=由原色变为指定色 有方向 * 2=由指定色变为原色 有方向 * 3=由原色变为指定色 无方向 * 4=由指定色变为原色 无方向
var colorType: Int = 0
// 变色角度
var colorAngle:Int = 0
//文本
var text: String = ""
//状态

View File

@@ -341,16 +341,17 @@ open class MapAutoView : FrameLayout, LonLatPointListener, ITraffic,ILockLocatio
mEventController = MapEventController()
}
mMapView?.let {
mMapView?.let { itx ->
if (CompileConfig.DEBUG) {
Log.i(TAG, "autoop-mapop-create--${mMapView}")
}
it.setEventController(mEventController)
addView(it)
itx.setEventController(mEventController)
addView(itx)
Log.d(TAG, "--- controller assign -->")
mMapController =
MapController(context, it, this@MapAutoView, mEventController, mMapStyleParams)
MapController(context, itx, this@MapAutoView, mEventController, mMapStyleParams)
locationClient?.takeIf { it.mMapController == null }?.also { it.mMapController = mMapController }
mMapController?.let { mapController ->
mMarkerController = MarkerController(mapController)
mapController.setMarkerController(mMarkerController)
@@ -358,8 +359,8 @@ open class MapAutoView : FrameLayout, LonLatPointListener, ITraffic,ILockLocatio
mLocationView = LocationHelper(context, mMarkerController, mMapController,mMapStyleParams)
mMapController?.setLocalView(mLocationView)
it.setMapController(mMapController)
it.mITraffic = this@MapAutoView
itx.setMapController(mMapController)
itx.mITraffic = this@MapAutoView
// init PanelManager
mPanelManager = PanelManager(this@MapAutoView, context, mMapController)
}

View File

@@ -51,8 +51,7 @@ dependencies {
implementation rootProject.ext.dependencies.arouter
kapt rootProject.ext.dependencies.aroutercompiler
// 高精地图
// implementation rootProject.ext.dependencies.mogocustommap
implementation project(':libraries:mapmodule')
implementation rootProject.ext.dependencies.mogocustommap
// 高德地图
api rootProject.ext.dependencies.amapnavi3dmap

View File

@@ -44,7 +44,7 @@ include ':libraries:mogo-map'
include ':libraries:mogo-adas'
include ':libraries:mogo-adas-data'
include ':libraries:mogo-obu'
include ':libraries:mapmodule'
//include ':libraries:mapmodule'
// 语音
include ':tts:tts-base'