Merge branch 'dev_arch_opt_3.0' into dev_robosweeper-d_app-module_221230_1.1.0

# Conflicts:
#	OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java
#	OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java
#	OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java
#	core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java
This commit is contained in:
donghongyu
2023-02-22 17:03:24 +08:00
393 changed files with 5513 additions and 3288 deletions

View File

@@ -0,0 +1,181 @@
package com.mogo.eagle.core.function.hmi.ui.map
import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.map.hdcache.IHdCacheListener
import me.jessyan.autosize.utils.AutoSizeUtils
/**
* 离线地图缓存
*/
class OfflineMapDialog(context: Context): BaseFloatDialog(context) {
private var roundRootLayout: ConstraintLayout? = null
private var offlineTitleView: TextView? = null
private var leftView: TextView? = null
private var rightView: TextView? = null
private var okView: TextView? = null
private var vertLineView: View? = null
private var horizontalLineView: View? = null
private var cacheTipView: TextView? = null
private var progressBar: ProgressBar? = null
private var downloadPercentView: TextView? = null
private var downloadResultImg: ImageView? = null
private var isLoading = false
private var isConfirm = true
private var isRetry = false
init {
setContentView(R.layout.dialog_offline_map)
setCanceledOnTouchOutside(true)
initView()
}
private fun initView() {
roundRootLayout = findViewById(R.id.roundRootLayout)
offlineTitleView = findViewById(R.id.tv_cache_title)
progressBar = findViewById(R.id.progressBar)
downloadPercentView = findViewById(R.id.tvDownloadProgress)
leftView = findViewById(R.id.tv_cache_confirm)
rightView = findViewById(R.id.tv_cache_cancel)
okView = findViewById(R.id.tv_cache_ok)
vertLineView = findViewById(R.id.view_vertical_line)
horizontalLineView = findViewById(R.id.view_horizontal_line)
cacheTipView = findViewById(R.id.tv_cache_tips)
downloadResultImg = findViewById(R.id.iv_download_Status)
leftView?.setOnClickListener {
when {
isConfirm -> {
showNewContent(isLoading = true, false)
cacheHDOfflineData()
}
else -> {
dismiss()
}
}
}
rightView?.setOnClickListener {
when {
isRetry -> {
showNewContent(isLoading = true, false)
cacheHDOfflineData()
}
else -> {
dismiss()
}
}
}
okView?.setOnClickListener {
if (isLoading) {
CallerMapUIServiceManager.cancelDownloadCacheData()
}
dismiss()
}
}
private fun cacheHDOfflineData() {
CallerMapUIServiceManager.cacheHDDataByCity(object : IHdCacheListener {
override fun onMapHdCacheProgress(cityId: Int, progress: Double) {
updateProgress(progress.toInt())
}
override fun onMapHdCacheResult(cityId: Int, state: Int) {
if (state == 0) {// 失败
showNewContent(isLoading = false, false)
}
}
})
}
@SuppressLint("SetTextI18n")
private fun updateProgress(progress: Int) {
if (this@OfflineMapDialog.isShowing) {
progressBar?.let {
if (it.visibility == View.VISIBLE) {
it.progress = if (progress in 1..5) 5 else progress
}
}
downloadPercentView?.text = "$progress%"
if (progress == 100) {
showNewContent(isLoading = false, true)
CallerHmiListenerManager.invokeHDDataCacheStatus(true)
}
}
}
private fun change2NewStyle() {
roundRootLayout?.layoutParams?.width = AutoSizeUtils.dp2px(context, 1110f)
roundRootLayout?.layoutParams?.height = AutoSizeUtils.dp2px(context, 668f)
val titleParams = offlineTitleView?.layoutParams as ConstraintLayout.LayoutParams
titleParams.topMargin = AutoSizeUtils.dp2px(context, 51f)
val horizontalLineParams = horizontalLineView?.layoutParams as ConstraintLayout.LayoutParams
horizontalLineParams.topMargin = AutoSizeUtils.dp2px(context, 374f)
progressBar?.visibility = View.VISIBLE
downloadPercentView?.visibility = View.VISIBLE
okView?.visibility = View.VISIBLE
vertLineView?.visibility = View.GONE
leftView?.visibility = View.GONE
rightView?.visibility = View.GONE
cacheTipView?.visibility = View.INVISIBLE
}
@SuppressLint("UseCompatLoadingForDrawables")
private fun showNewContent(isLoading: Boolean, isSuccess: Boolean) {
this.isLoading = isLoading
change2NewStyle()
when {
isLoading -> {
okView?.text = context.resources.getString(R.string.cancel)
offlineTitleView?.text = context.resources.getString(R.string.offline_downloading)
downloadResultImg?.visibility = View.GONE
}
else -> {
downloadResultImg?.visibility = View.VISIBLE
when {
isSuccess -> {
okView?.visibility = View.VISIBLE
okView?.text = context.resources.getString(R.string.ok_tip)
offlineTitleView?.text = context.resources.getString(R.string.offline_download_success)
progressBar?.visibility = View.GONE
downloadPercentView?.visibility = View.GONE
downloadResultImg?.background = ContextCompat.getDrawable(context, R.drawable.download_success_icon)
}
else -> {
isRetry = true
isConfirm = false
offlineTitleView?.text = context.resources.getString(R.string.offline_download_failure)
okView?.visibility = View.GONE
progressBar?.visibility = View.GONE
downloadPercentView?.visibility = View.GONE
leftView?.visibility = View.VISIBLE
leftView?.text = context.resources.getString(R.string.ok_tip)
rightView?.visibility = View.VISIBLE
vertLineView?.visibility = View.VISIBLE
rightView?.text = context.resources.getString(R.string.retry)
downloadResultImg?.background = ContextCompat.getDrawable(context, R.drawable.download_fail_icon)
}
}
}
}
}
}

View File

@@ -7,9 +7,10 @@ import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
@@ -83,9 +84,13 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor(
if(isShowData){
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
if(category == MsgCategory.RECORD_BAG){
//弹出被动录包弹窗
CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true)
}else{
if(!FunctionBuildConfig.isDemoMode){
//弹出被动录包弹窗
CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true)
}
} else if(category == MsgCategory.SYS_INFO){
//todo 过滤MAP系统异常报警
} else{
clMsgBubbleLayout.visibility = View.VISIBLE
dataList.add(msgBoxBean)
driverMsgBoxBubbleAdapter?.setData(dataList)

View File

@@ -6,7 +6,7 @@ import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.hmi.R
import kotlinx.android.synthetic.main.view_driver_msg_box_button.view.*

View File

@@ -7,16 +7,18 @@ import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxListAdapter
import com.mogo.eagle.core.function.msgbox.MsgBoxConfig
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.layout_driver_msg_box_list.view.*
import org.greenrobot.eventbus.EventBus
@@ -244,6 +246,7 @@ class DriverMsgBoxListView @JvmOverloads constructor(
notifyData()
ipcReportList?.let {
linearLayoutManager?.scrollToPositionWithOffset(it.indexOf(msgBoxBean),0)
driverMsgBoxListAdapter?.setReportShowData(msgBoxBean)
}
}
}

View File

@@ -9,7 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.hmi.R

View File

@@ -0,0 +1,79 @@
package com.mogo.eagle.core.function.hmi.ui.msgbox
import android.app.Activity
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.MMsgBoxBubbleAdapter
import com.mogo.eagle.core.function.msgbox.MsgBoxConfig
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.layout_m_msg_box_bubble.view.*
class MMsgBoxBubbleView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener {
private val TAG = "MMsgBoxBubbleView"
private val dataList :ArrayList<MsgBoxBean> = ArrayList()
private var mMsgBoxBubbleAdapter: MMsgBoxBubbleAdapter?= null
private var isShowData = true
init {
LayoutInflater.from(context).inflate(R.layout.layout_m_msg_box_bubble, this, true)
initView()
}
private fun initView(){
val linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
mMsgBoxBubbleAdapter = MMsgBoxBubbleAdapter(context as Activity)
rvMBubbleList.adapter = mMsgBoxBubbleAdapter
rvMBubbleList.layoutManager = linearLayoutManager
}
/**
* 是否展示接收消息,消息盒子打开状态下不再展示气泡消息
* @param show true 展示false 不展示
*/
fun isShowData(show: Boolean){
isShowData = show
}
override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) {
UiThreadHandler.post {
if(category == MsgCategory.NOTICE){
if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X
|| msgBoxList.type == MsgBoxType.OBU){
MsgBoxConfig.noticeList.add(msgBoxList)
if(isShowData){
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
dataList.add(msgBoxList)
mMsgBoxBubbleAdapter?.setData(dataList)
}
}
}
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerMsgBoxListenerManager.addListener(TAG,this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerMsgBoxListenerManager.removeListener(TAG)
}
}

View File

@@ -0,0 +1,85 @@
package com.mogo.eagle.core.function.hmi.ui.msgbox
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.hmi.R
import kotlinx.android.synthetic.main.view_m1_msg_box_button.view.*
class MMsgBoxButtonView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
): ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxEventListener {
companion object {
const val TAG = "MMsgBoxButtonView"
}
private var clickListener: ClickListener? = null
init{
LayoutInflater.from(context).inflate(R.layout.view_m1_msg_box_button, this, true)
initView()
}
private fun initView(){
cbMsgBoxM1.setOnCheckedChangeListener { _, isChecked ->
clickListener?.showMsgBoxList(isChecked)
msgBoxMTipView.visibility = View.GONE
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerMsgBoxEventListenerManager.addListener(TAG,this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerMsgBoxEventListenerManager.removeListener(TAG)
}
override fun onSummaryClickEvent() {
}
/**
* 更新新消息提醒红点
* @param isShow true:展示false:不展示
*/
override fun onUpdateTipEvent(isShow: Boolean) {
if(isShow){
msgBoxMTipView.visibility = View.VISIBLE
}else{
msgBoxMTipView.visibility = View.GONE
}
}
override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) {
cbMsgBoxM1.performClick()
}
override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) {
cbMsgBoxM1.performClick()
}
override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) {
cbMsgBoxM1.performClick()
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
interface ClickListener{
fun showMsgBoxList(show: Boolean)
}
}

View File

@@ -0,0 +1,105 @@
package com.mogo.eagle.core.function.hmi.ui.msgbox
import android.app.Activity
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.MMsgBoxListAdapter
import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.layout_m_msg_box_list.view.*
class MMsgBoxListView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IMsgBoxEventListener {
private val TAG = "MMsgBoxListView"
var mMsgBoxListAdapter: MMsgBoxListAdapter?= null
private var noticeList: ArrayList<MsgBoxBean> ?= null
init{
LayoutInflater.from(context).inflate(R.layout.layout_m_msg_box_list, this, true)
initView()
}
private fun initView(){
val linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
val divider = DividerItemDecoration(context, linearLayoutManager.orientation)
getDrawable(R.drawable.rv_divider_line_m)?.let { divider.setDrawable(it) }
mMsgBoxListAdapter = MMsgBoxListAdapter(context as Activity)
rvMList.adapter = mMsgBoxListAdapter
rvMList.layoutManager = linearLayoutManager
rvMList.addItemDecoration(divider)
//获取通知消息列表
noticeList= CallerMsgBoxManager.getCachedNotifyData() as ArrayList<MsgBoxBean>?
noticeList = noticeList?.let { ArrayList(it.reversed()) }
noticeList?.let {
mMsgBoxListAdapter?.setData(it)
}
}
override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) {
UiThreadHandler.post{
if(category == MsgCategory.NOTICE){
if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X
|| msgBoxList.type == MsgBoxType.OBU){
noticeList?.add(0,msgBoxList)
noticeList?.let {
mMsgBoxListAdapter?.setData(it)
}
}
}
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerMsgBoxListenerManager.addListener(TAG,this)
CallerMsgBoxEventListenerManager.addListener(TAG,this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerMsgBoxListenerManager.removeListener(TAG)
CallerMsgBoxEventListenerManager.removeListener(TAG)
}
override fun onSummaryClickEvent() {
}
override fun onUpdateTipEvent(isShow: Boolean) {
}
override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) {
}
override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) {
noticeList?.let {
rvMList.scrollToPosition(it.indexOf(msgBoxBean))
}
}
override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) {
}
}

View File

@@ -6,18 +6,15 @@ import android.util.AttributeSet
import android.view.*
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.PassengerMsgBoxBubbleAdapter
import com.mogo.eagle.core.function.msgbox.MsgBoxConfig
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.layout_passenger_msg_box_bubble.view.*

View File

@@ -6,7 +6,7 @@ import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.hmi.R
import kotlinx.android.synthetic.main.view_passenger_msg_box_button.view.*

View File

@@ -7,18 +7,16 @@ import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.PassengerMsgBoxListAdapter
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.layout_passenger_msg_box_list.view.*

View File

@@ -32,6 +32,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var data: List<MsgBoxBean>? = null
private var reportBean: MsgBoxBean ?= null
private val operation: Int = 1
private val notice: Int = 2
@@ -50,6 +51,10 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
notifyDataSetChanged()
}
fun setReportShowData(reportClickBean: MsgBoxBean){
reportBean = reportClickBean
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
when (viewType) {
record -> {
@@ -103,6 +108,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
}
is MsgBoxIpcReportHolder -> {
data?.let { it ->
val reportMsgBox = it[position]
holder.tvReportTimeNormal.text =
"时间:${TimeUtils.millis2String(it[position].timestamp)}"
holder.tvReportTimeOpen.text =
@@ -138,6 +144,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
holder.tvReportTypeNormal.text = resultStr
holder.tvReportTypeOpen.text = resultStr
holder.tvReportReasonOpen.text = "原因:${reportEntity.msg}"
holder.tvReportSrcOpen.text = "消息来源:${reportEntity.src}"
var actionStr = ""
for (action in reportEntity.actionsList) {
actionStr =
@@ -152,6 +159,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
null,
null
)
holder.tvStatusSelect.text = "折叠"
holder.ivReportImageNormal.visibility = View.GONE
holder.tvReportLevelNormal.visibility = View.GONE
holder.tvReportTimeNormal.visibility = View.GONE
@@ -162,6 +170,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
holder.tvReportTimeOpen.visibility = View.VISIBLE
holder.tvReportTypeOpen.visibility = View.VISIBLE
holder.tvReportReasonOpen.visibility = View.VISIBLE
holder.tvReportSrcOpen.visibility = View.VISIBLE
holder.tvReportActionOpen.visibility = View.VISIBLE
} else {
holder.tvStatusSelect.setCompoundDrawablesWithIntrinsicBounds(
@@ -170,6 +179,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
null,
null
)
holder.tvStatusSelect.text = "展开"
holder.ivReportImageNormal.visibility = View.VISIBLE
holder.tvReportLevelNormal.visibility = View.VISIBLE
holder.tvReportTimeNormal.visibility = View.VISIBLE
@@ -180,9 +190,16 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
holder.tvReportTimeOpen.visibility = View.GONE
holder.tvReportTypeOpen.visibility = View.GONE
holder.tvReportReasonOpen.visibility = View.GONE
holder.tvReportSrcOpen.visibility = View.GONE
holder.tvReportActionOpen.visibility = View.GONE
}
}
reportBean?.let {
if(reportMsgBox.timestamp == it.timestamp){
holder.tvStatusSelect.performClick()
}
}
}
}
is MsgBoxOperation -> {
@@ -200,6 +217,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
null,
null
)
holder.tvOperationStatusSelect.text = "折叠"
holder.ivOperationImageNormal.visibility = View.GONE
holder.tvOperationTitleNormal.visibility = View.GONE
holder.tvOperationContentNormal.visibility = View.GONE
@@ -214,6 +232,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
null,
null
)
holder.tvOperationStatusSelect.text = "展开"
holder.ivOperationImageNormal.visibility = View.VISIBLE
holder.tvOperationTitleNormal.visibility = View.VISIBLE
holder.tvOperationContentNormal.visibility = View.VISIBLE
@@ -329,6 +348,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
var tvReportTimeOpen: TextView = itemView.findViewById(R.id.tvReportTimeOpen)
var tvReportTypeOpen: TextView = itemView.findViewById(R.id.tvReportTypeOpen)
var tvReportReasonOpen: TextView = itemView.findViewById(R.id.tvReportReasonOpen)
var tvReportSrcOpen: TextView = itemView.findViewById(R.id.tvReportSrcOpen)
var tvReportActionOpen: TextView = itemView.findViewById(R.id.tvReportActionOpen)
}

View File

@@ -0,0 +1,178 @@
package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter
import android.app.Activity
import android.os.CountDownTimer
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.msgbox.*
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat
import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout
class MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var data: ArrayList<MsgBoxBean> ?= null
private val notice: Int = 1
private val v2x: Int = 2
private val summary: Int = 3
var countDownTimer: CountDownTimer?=null
fun setData(data: ArrayList<MsgBoxBean>){
this.data = data
if(data.size>3){
data.removeAt(0)
}
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
notice -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_notice,parent,false)
BubbleNoticeHolder(view)
}
summary -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_summary,parent,false)
BubbleSummaryHolder(view)
}
else -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_v2x,parent,false)
BubbleV2XHolder(view)
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is BubbleNoticeHolder -> {
data?.let {
val noticeFrCloudMsg = it[position].bean as NoticeFrCloudMsg
if(noticeFrCloudMsg.type == 0){
val noticeNormalData = noticeFrCloudMsg.noticeNormalData
holder.tvMNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
holder.tvMNoticeContent.text = noticeNormalData?.content
GlideApp.with(activity).load(noticeNormalData?.imageUrl).placeholder(R.drawable.icon_passenger_operation)
.optionalTransform(
GlideRoundedCornersTransform(
20f,
GlideRoundedCornersTransform.CornerType.ALL
)
).into(holder.ivMNoticeImage)
holder.tvMNoticeCheck.setOnClickListener {
//云公告
noticeNormalData?.let { it1 -> CallerHmiManager.showNoticeNormalData(it1) }
}
}else if(noticeFrCloudMsg.type == 1){
val noticeTrafficStylePushData = noticeFrCloudMsg.trafficPushData
holder.tvMNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
holder.tvMNoticeContent.text = noticeTrafficStylePushData?.content
GlideApp.with(activity).load(noticeTrafficStylePushData?.poiImgUrl).placeholder(R.drawable.icon_passenger_operation)
.optionalTransform(
GlideRoundedCornersTransform(
20f,
GlideRoundedCornersTransform.CornerType.ALL
)
).into(holder.ivMNoticeImage)
holder.tvMNoticeCheck.setOnClickListener {
//云公告
noticeTrafficStylePushData?.let { it1 -> CallerHmiManager.showTrafficBanner(it1) }
}
}
}
}
is BubbleV2XHolder -> {
data?.let {
val msgBoxBean = it[position]
val v2XMsg = msgBoxBean.bean as V2XMsg
holder.tvMV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
holder.tvMV2XContent.text = v2XMsg.content
holder.ivMV2XImage.setImageDrawable(activity.resources.getDrawable(
EventTypeEnumNew.getUpdateIconRes(v2XMsg.type)))
holder.clMVeXLayout.setOnClickListener {
CallerMsgBoxEventListenerManager.invokeBubbleV2XListener(msgBoxBean)
}
}
}
is BubbleSummaryHolder -> {
data?.let {
val summaryMsg= it[position].bean as V2XMsg
holder.tvMSummaryTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
holder.tvMSummaryContent.text = summaryMsg.content
holder.tvMSummaryCheck.setOnClickListener {
//跳转全览模式
// CallerHmiManager.showSmallFragment()
CallerMsgBoxEventListenerManager.invokeSummaryListener()
}
}
}
}
val msgBoxBean: MsgBoxBean = data!![position]
countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),1000){
override fun onTick(p0: Long) {
}
override fun onFinish() {
data?.remove(msgBoxBean)
notifyDataSetChanged()
// notifyItemRemoved(index)
// notifyItemRangeChanged(index,recordTypeEntity.size-index)
}
}
countDownTimer?.start()
}
override fun getItemCount() = data?.size ?: 0
override fun getItemViewType(position: Int): Int {
return if(data!![position].type == MsgBoxType.NOTICE){
notice
}else if(data!![position].type == MsgBoxType.V2X && data!![position].sourceType == DataSourceType.SUMMARY){
summary
} else{
v2x
}
}
//Notice
class BubbleNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var ivMNoticeImage: ImageView = itemView.findViewById(R.id.ivMNoticeImage)
var tvMNoticeTitle: TextView = itemView.findViewById(R.id.tvMNoticeTitle)
var tvMNoticeContent: TextView = itemView.findViewById(R.id.tvMNoticeContent)
var tvMNoticeCheck: TextView = itemView.findViewById(R.id.tvMNoticeCheck)
var tvMNoticeTime: TextView = itemView.findViewById(R.id.tvMNoticeTime)
}
//OBU、V2X
class BubbleV2XHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var ivMV2XImage: ImageView = itemView.findViewById(R.id.ivMV2XImage)
var tvMV2XTime: TextView = itemView.findViewById(R.id.tvMV2XTime)
var tvMV2XContent: TextView = itemView.findViewById(R.id.tvMV2XContent)
var clMVeXLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clMVeXLayout)
}
//汇总消息
class BubbleSummaryHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var tvMSummaryContent: TextView = itemView.findViewById(R.id.tvMSummaryContent)
var tvMSummaryCheck: TextView = itemView.findViewById(R.id.tvMSummaryCheck)
var tvMSummaryTime: TextView = itemView.findViewById(R.id.tvMSummaryTime)
}
}

View File

@@ -0,0 +1,152 @@
package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter
import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.NoticeFrCloudMsg
import com.mogo.eagle.core.data.msgbox.V2XMsg
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp
class MMsgBoxListAdapter(private val activity: Activity): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var data: List<MsgBoxBean> ?= null
private val notice: Int = 1
private val v2x: Int = 2
private val summary: Int = 3
fun setData(data: List<MsgBoxBean>){
this.data = data
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
notice -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_list_notice,parent,false)
ListNoticeHolder(view)
}
summary -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_list_summary,parent,false)
ListSummaryHolder(view)
}
else -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_list_v2x,parent,false)
ListV2XHolder(view)
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ListNoticeHolder -> {
data?.let {
val noticeFrCloudMsg = it[position].bean as NoticeFrCloudMsg
if(noticeFrCloudMsg.type == 0){
val noticeNormalData = noticeFrCloudMsg.noticeNormalData
holder.tvMNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
holder.tvMNoticeContent.text = noticeNormalData?.content
GlideApp.with(activity).load(noticeNormalData?.imageUrl).placeholder(R.drawable.icon_notice_default)
.optionalTransform(
GlideRoundedCornersTransform(
20f,
GlideRoundedCornersTransform.CornerType.ALL
)
).into(holder.ivMNoticeImage)
holder.tvMNoticeCheck.setOnClickListener {
//云公告
noticeNormalData?.let { it1 -> CallerHmiManager.showNoticeNormalData(it1) }
}
}else if(noticeFrCloudMsg.type == 1){
val noticeTrafficStylePushData = noticeFrCloudMsg.trafficPushData
holder.tvMNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
holder.tvMNoticeContent.text = noticeTrafficStylePushData?.content
GlideApp.with(activity).load(noticeTrafficStylePushData?.poiImgUrl).placeholder(R.drawable.icon_notice_default)
.optionalTransform(
GlideRoundedCornersTransform(
20f,
GlideRoundedCornersTransform.CornerType.ALL
)
).into(holder.ivMNoticeImage)
holder.tvMNoticeCheck.setOnClickListener {
//云公告
noticeTrafficStylePushData?.let { it1 -> CallerHmiManager.showTrafficBanner(it1) }
}
}
}
}
is ListV2XHolder -> {
data?.let {
val msgBoxBean = it[position]
val v2XMsg = msgBoxBean.bean as V2XMsg
holder.tvMV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
holder.tvMV2XContent.text = v2XMsg.content
holder.ivMV2XImage.setImageDrawable(activity.resources.getDrawable(
EventTypeEnumNew.getUpdateIconRes(v2XMsg.type)))
}
}
is ListSummaryHolder -> {
data?.let {
val summaryMsg= it[position].bean as V2XMsg
holder.tvMSummaryTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
holder.tvMSummaryContent.text = summaryMsg.content
holder.tvMSummaryCheck.setOnClickListener {
//跳转全览模式
// CallerHmiManager.showSmallFragment()
CallerMsgBoxEventListenerManager.invokeSummaryListener()
}
}
}
}
}
override fun getItemCount() = data?.size ?: 0
override fun getItemViewType(position: Int): Int {
return if(data!![position].type == MsgBoxType.NOTICE){
notice
}else if(data!![position].type == MsgBoxType.V2X && data!![position].sourceType == DataSourceType.SUMMARY){
summary
} else{
v2x
}
}
//Notice
class ListNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var ivMNoticeImage: ImageView = itemView.findViewById(R.id.ivMNoticeImage)
var tvMNoticeTitle: TextView = itemView.findViewById(R.id.tvMNoticeTitle)
var tvMNoticeContent: TextView = itemView.findViewById(R.id.tvMNoticeContent)
var tvMNoticeCheck: TextView = itemView.findViewById(R.id.tvMNoticeCheck)
var tvMNoticeTime: TextView = itemView.findViewById(R.id.tvMNoticeTime)
}
//OBU、V2X
class ListV2XHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var ivMV2XImage: ImageView = itemView.findViewById(R.id.ivMV2XImage)
var tvMV2XTime: TextView = itemView.findViewById(R.id.tvMV2XTime)
var tvMV2XContent: TextView = itemView.findViewById(R.id.tvMV2XContent)
}
//汇总消息
class ListSummaryHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var tvMSummaryContent: TextView = itemView.findViewById(R.id.tvMSummaryContent)
var tvMSummaryCheck: TextView = itemView.findViewById(R.id.tvMSummaryCheck)
var tvMSummaryTime: TextView = itemView.findViewById(R.id.tvMSummaryTime)
}
}

View File

@@ -8,7 +8,6 @@ import android.widget.TextView
import androidx.lifecycle.LifecycleObserver
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.mogo.cloud.commons.utils.CoordinateUtils
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.module.status.IMogoStatusChangedListener
import com.mogo.commons.module.status.MogoStatusManager
@@ -31,6 +30,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.BitmapHelper
import com.mogo.eagle.core.utilcode.util.CoordinateUtils
import com.mogo.eagle.core.utilcode.util.DateTimeUtils
import com.mogo.eagle.core.widget.media.video.NoticeSimpleSmallVideoPlayer
import com.shuyu.gsyvideoplayer.GSYVideoManager

View File

@@ -33,7 +33,7 @@ class AccelerationFloatWindow constructor(activity: Activity) : View.OnTouchList
private var mInScreenY = 0f
init {
initFloatWindow();
initFloatWindow()
}
private fun initFloatWindow() {

View File

@@ -73,9 +73,6 @@ import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.utilcode.util.*
import com.mogo.map.uicontroller.VisualAngleMode
import com.mogo.map.uicontroller.VisualAngleMode.*
import com.mogo.support.obu.MogoObuManager
import com.mogo.support.obu.constants.MogoObuLogLevel
import com.mogo.support.obu.option.MogoObuLog
import kotlinx.android.synthetic.main.view_debug_setting.view.*
import kotlinx.coroutines.launch
import mogo.telematics.pad.MessagePad
@@ -671,11 +668,6 @@ internal class DebugSettingView @JvmOverloads constructor(
FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = isChecked
}
//TODO
tbIsDrawPath.setOnCheckedChangeListener { _, isChecked ->
}
// 初始化 GSP数据源 数据
rgGpsProvider.check(
when (FunctionBuildConfig.gpsProvider) {
@@ -1200,14 +1192,7 @@ internal class DebugSettingView @JvmOverloads constructor(
* 设置是否输出OBU日志 true-打印日志false-不打印日志
*/
tbObuLog.setOnCheckedChangeListener { _, isChecked ->
MogoObuManager.getInstance().setEnableLog(isChecked)
val builder: com.mogo.support.obu.option.MogoObuLog.Builder =
MogoObuLog.newBuilder().setEnableStdio(isChecked)
if (isChecked) {
builder.setStdioLevel(MogoObuLogLevel.DBG)
}
MogoObuManager.getInstance().logConfig(builder.build())
CallerObuApiManager.setObuLog(isChecked)
}
/**
@@ -1937,12 +1922,12 @@ internal class DebugSettingView @JvmOverloads constructor(
}
/**
* 车辆挂档位
* 车辆挂档位
* @param gear 档位
*/
override fun onAutopilotGearData(gear: Chassis.GearPosition) {
ThreadUtils.runOnUiThread {
tvGearInfo.text = "档位:${gear}"
tvGearInfo.text = "档位:${gear}"
}
}

View File

@@ -65,7 +65,7 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener {
private var ipcWarningReportList: List<ReportEntity>? = null//警告上报列表
init {
initFloatWindow();
initFloatWindow()
}
private fun initFloatWindow() {

View File

@@ -45,6 +45,7 @@ internal class SOPSettingView @JvmOverloads constructor(
}
private fun initView() {
sopLayout.setOnClickListener { }
//绕障类功能开关
tbObstacleAvoidance.isChecked = FunctionBuildConfig.isDetouring
tbObstacleAvoidance.setOnCheckedChangeListener { _, isChecked ->
@@ -95,18 +96,19 @@ internal class SOPSettingView @JvmOverloads constructor(
}
/**
* obu V2V开关
* obu V2V开关,默认打开
*/
tbObuV2vView.isChecked = HmiBuildConfig.isShowObuV2vView
tbObuV2vView.setOnCheckedChangeListener { _, isChecked ->
// 默认关闭
HmiBuildConfig.isShowObuV2vView = isChecked
}
/**
* obu V2i开关
* obu V2i开关,默认打开
*/
tbObuV2iView.isChecked = HmiBuildConfig.isShowObuV2iView
tbObuV2iView.setOnCheckedChangeListener { _, isChecked ->
// 默认关闭
HmiBuildConfig.isShowObuV2iView = isChecked
}
@@ -116,7 +118,6 @@ internal class SOPSettingView @JvmOverloads constructor(
tbObuToDcView.setOnCheckedChangeListener { _, isChecked ->
// 默认开启
HmiBuildConfig.isShowObuToDcV2iView = !isChecked
// Log.d("liyz", "HmiBuildConfig.isShowObuToDcV2iView = " + HmiBuildConfig.isShowObuToDcV2iView)
}
//红绿灯标识
@@ -144,7 +145,10 @@ internal class SOPSettingView @JvmOverloads constructor(
// 演示模式,上一次勾选的数据
tbDemoMode.isChecked = FunctionBuildConfig.isDemoMode
// 演示模式
tbDemoMode.setOnCheckedChangeListener { _, _ ->
tbDemoMode.setOnCheckedChangeListener { compoundButton, _ ->
if(!compoundButton.isPressed){
return@setOnCheckedChangeListener
}
FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode
CallerHmiManager.updateStatusBarLeftView(FunctionBuildConfig.isDemoMode, "demoMode", DemoModeView(context))
CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode)
@@ -162,7 +166,10 @@ internal class SOPSettingView @JvmOverloads constructor(
// 雨天模式,上一次勾选的数据
tbRainMode.isChecked = FunctionBuildConfig.isRainMode
//雨天模式
tbRainMode.setOnCheckedChangeListener { _, isChecked ->
tbRainMode.setOnCheckedChangeListener { compoundButton, isChecked ->
if(!compoundButton.isPressed){
return@setOnCheckedChangeListener
}
CallerAutoPilotControlManager.setRainMode(isChecked)
FunctionBuildConfig.isRainMode = isChecked
}
@@ -174,7 +181,7 @@ internal class SOPSettingView @JvmOverloads constructor(
//OBU控制总开关
tbObu.isChecked = CallerObuApiManager.isConnected()
tbObu.setOnCheckedChangeListener { _, isChecked ->
if (!isChecked) {
if (isChecked) {
CallerObuApiManager.resetObuIpAddress("192.168.1.199")
} else {
//断开链接
@@ -251,11 +258,8 @@ internal class SOPSettingView @JvmOverloads constructor(
private val timerTaskRefresh = object : TimerTask(){
override fun run() {
UiThreadHandler.post{
if(FunctionBuildConfig.isDemoMode){
tbDemoMode.text = "关闭美化模式"
}else{
tbDemoMode.text = "开启美化模式"
}
tbDemoMode.isChecked = FunctionBuildConfig.isDemoMode
tbRainMode.isChecked = FunctionBuildConfig.isRainMode
}
}
@@ -265,39 +269,27 @@ internal class SOPSettingView @JvmOverloads constructor(
when (type) {
FuncBizConfig.BIZ_BEAUTY_MODE -> {
tbDemoMode.isClickable = !lock
val (left,top,right,bottom) = tbDemoMode.currentPadding()
if (lock) {
tbDemoMode.background =
resources.getDrawable(R.drawable.radio_button_lock_background)
} else {
tbDemoMode.background =
resources.getDrawable(R.drawable.radio_button_normal_background_right)
if(lock){
tbDemoMode.visibility = View.INVISIBLE
}else{
tbDemoMode.visibility = View.VISIBLE
}
tbDemoMode.setPadding(left,top,right,bottom)
}
FuncBizConfig.BIZ_RAIN_MODE -> {
tbRainMode.isClickable = !lock
val (left,top,right,bottom) = tbRainMode.currentPadding()
if (lock) {
tbRainMode.background =
resources.getDrawable(R.drawable.radio_button_lock_background)
tbRainMode.visibility = View.INVISIBLE
} else {
tbRainMode.background =
resources.getDrawable(R.drawable.radio_button_normal_background_right)
tbRainMode.visibility = View.VISIBLE
}
tbRainMode.setPadding(left,top,right,bottom)
}
FuncBizConfig.BIZ_PNC_WARNING -> {
tbMarkingObstacles.isClickable = !lock
val (left,top,right,bottom) = tbMarkingObstacles.currentPadding()
if (lock) {
tbMarkingObstacles.background =
resources.getDrawable(R.drawable.radio_button_lock_background)
tbMarkingObstacles.visibility = View.INVISIBLE
} else {
tbMarkingObstacles.background =
resources.getDrawable(R.drawable.radio_button_normal_background_right)
tbMarkingObstacles.visibility = View.VISIBLE
}
tbMarkingObstacles.setPadding(left,top,right,bottom)
}
}
}

View File

@@ -45,7 +45,9 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor(
defStyleAttr
), IMoGoAutopilotStatusListener {
private val TAG = "AutoPilotAndCheckView"
companion object{
private const val TAG = "AutoPilotAndCheckView"
}
private var clickListener: ClickListener? = null
private var keyBoardUtil: KeyBoardUtil? = null
@@ -57,10 +59,11 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor(
initView()
}
companion object {
private var maxAcceleration: Double = 2.0
private var speedLimit: Int = 0
}
@Volatile
private var maxAcceleration: Double = 2.0
@Volatile
private var speedLimit: Int = 0
@SuppressLint("ClickableViewAccessibility")
private fun initView() {
@@ -197,6 +200,10 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor(
systemVersionView?.showAdUpgradeStatus(ipcUpgradeStateInfo)
}
fun updateHDDataCacheStatus(isCached: Boolean) {
systemVersionView?.updateHDDataCacheStatus(isCached)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)

View File

@@ -30,7 +30,7 @@ class BusOperationView @JvmOverloads constructor(
context?.let {
actvAccountPhone.text = phoneMask(SharedPrefs.getInstance(it).getString("och_account",""))
}
clickPersonalRightView();
clickPersonalRightView()
}
private fun initPersonalIcon() {

View File

@@ -4,7 +4,6 @@ import android.content.Context
import android.util.AttributeSet
import android.util.TypedValue.COMPLEX_UNIT_PX
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
@@ -17,7 +16,7 @@ import com.mogo.eagle.core.data.trafficlight.isRed
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener.Companion.STATUS_AUTOPILOT_RUNNING
import com.mogo.eagle.core.function.api.v2x.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager
import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager
@@ -25,8 +24,6 @@ import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.zhjt.service_biz.BizConfig
import kotlinx.android.synthetic.main.view_pnc_actions.view.*
import me.jessyan.autosize.AutoSize
import me.jessyan.autosize.utils.AutoSizeUtils
import mogo.telematics.pad.MessagePad
class PncActionsView @JvmOverloads constructor(
@@ -52,16 +49,25 @@ class PncActionsView @JvmOverloads constructor(
init {
LayoutInflater.from(context).inflate(R.layout.view_pnc_actions, this, true)
val a = context.obtainStyledAttributes(attrs, R.styleable.PncActionsView, defStyleAttr, 0)
bgResources = a.getResourceId(R.styleable.PncActionsView_background_resource, R.drawable.pnc_actions_bg)
topMargin = a.getResourceId(R.styleable.PncActionsView_pnc_top_margin,resources.getDimension(R.dimen.dp_30).toInt())
txtSize = a.getResourceId(R.styleable.PncActionsView_pnc_size,resources.getDimension(R.dimen.dp_34).toInt())
bgResources = a.getResourceId(
R.styleable.PncActionsView_background_resource,
R.drawable.pnc_actions_bg
)
topMargin = a.getResourceId(
R.styleable.PncActionsView_pnc_top_margin,
resources.getDimension(R.dimen.dp_30).toInt()
)
txtSize = a.getResourceId(
R.styleable.PncActionsView_pnc_size,
resources.getDimension(R.dimen.dp_34).toInt()
)
a.recycle()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
(tvHmiPncActions.layoutParams as MarginLayoutParams).topMargin = topMargin
tvHmiPncActions.setTextSize(COMPLEX_UNIT_PX,txtSize.toFloat())
tvHmiPncActions.setTextSize(COMPLEX_UNIT_PX, txtSize.toFloat())
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerPlanningActionsListenerManager.addListener(TAG, this)
@@ -88,45 +94,51 @@ class PncActionsView @JvmOverloads constructor(
@BizConfig(FOUNDATION, "", BIZ_PNC_ACTIONS)
override fun pncActions(planningActionMsg: MessagePad.PlanningActionMsg) {
mAutoPilotStatusInfo?.let {
if (it.state == STATUS_AUTOPILOT_RUNNING) {
try {
mAutoPilotStatusInfo?.let {
UiThreadHandler.post {
var actions: String? = null
planningActionMsg.actionMsg?.let { it ->
try {
actions = PncActionsHelper.getAction(
it.drivingState.number,
it.drivingAction.number
)
} catch (e: Exception) {
e.printStackTrace()
if (it.state == STATUS_AUTOPILOT_RUNNING) {
var actions: String? = null
planningActionMsg.actionMsg?.let { it ->
try {
actions = PncActionsHelper.getAction(
it.drivingState.number,
it.drivingAction.number
)
} catch (e: Exception) {
e.printStackTrace()
}
//如果是存在云端红绿灯数据条件下,设置云端数据
if (PncActionsHelper.isWaitingTrafficlight(
it.drivingState.number,
it.drivingAction.number
)
&& mTrafficLightResult != null
&& getWaitTrafficLightTime().isNotBlank()
) {
actions += ",预计${getWaitTrafficLightTime()}秒后通过"
} else {
mTrafficLightResult = null
}
}
//如果是存在云端红绿灯数据条件下,设置云端数据
if (PncActionsHelper.isWaitingTrafficlight(
it.drivingState.number,
it.drivingAction.number
)
&& mTrafficLightResult != null
&& getWaitTrafficLightTime().isNotBlank()
) {
actions += ",预计${getWaitTrafficLightTime()}秒后通过"
// update view
if (actions.isNullOrEmpty()) {
this.background = null
tvHmiPncActions.text = ""
} else {
mTrafficLightResult = null
this.background =
AppCompatResources.getDrawable(context, bgResources)
tvHmiPncActions.text = actions
}
}
// update view
if (actions.isNullOrEmpty()) {
} else {
this.background = null
tvHmiPncActions.text = ""
} else {
this.background =
AppCompatResources.getDrawable(context, bgResources)
tvHmiPncActions.text = actions
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) {

View File

@@ -9,8 +9,8 @@ import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import kotlinx.android.synthetic.main.view_blue_tooth.view.*
import kotlinx.android.synthetic.main.view_status_bar.view.*
/**
* 魔戒蓝牙控件
@@ -42,10 +42,12 @@ class BlueToothView @JvmOverloads constructor(
override fun mofangStatus(status: Boolean) {
super.mofangStatus(status)
if (status) {
mofangView.setImageResource(R.drawable.icon_bluetooth_p)
} else {
mofangView.setImageResource(R.drawable.blue_tooth)
ThreadUtils.runOnUiThread {
if (status) {
mofangView.setImageResource(R.drawable.icon_bluetooth_p)
} else {
mofangView.setImageResource(R.drawable.blue_tooth)
}
}
}

View File

@@ -15,6 +15,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.notification.WarningFloat
import com.mogo.eagle.core.function.hmi.ui.tools.DockerRebootDialog
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import kotlinx.android.synthetic.main.view_check_system.view.*
@@ -106,7 +107,9 @@ class CheckSystemView @JvmOverloads constructor(
override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {
connectStatus = autoPilotStatusInfo.connectStatus
autopilotStatus = autoPilotStatusInfo.state
setViewStatus()
ThreadUtils.runOnUiThread {
setViewStatus()
}
}
private fun setViewStatus() {

View File

@@ -8,7 +8,6 @@ import android.util.AttributeSet
import android.util.DisplayMetrics
import android.view.View
import android.view.animation.LinearInterpolator
import android.view.animation.OvershootInterpolator
import androidx.core.content.ContextCompat
import com.mogo.eagle.core.function.hmi.R
@@ -22,7 +21,6 @@ class CircularProgressView @JvmOverloads constructor(
: View(context, attrs, defStyleAttr) {
val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.CircularProgressView)
val TAG: String = "CircularProgressView"
// 绘制画笔
private val mBackPaint: Paint = Paint()
@@ -66,17 +64,17 @@ class CircularProgressView @JvmOverloads constructor(
} else {
mConvertColorsArray = null
}
typedArray.recycle();
typedArray.recycle()
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val viewWide = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
val viewHigh = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
val viewWide = measuredWidth - paddingLeft - paddingRight
val viewHigh = measuredHeight - paddingTop - paddingBottom
val mRectLength =
((if (viewWide > viewHigh) viewHigh else viewWide) - if (mBackPaint.strokeWidth > mProgPaint.strokeWidth) mBackPaint.strokeWidth else mProgPaint.strokeWidth).toInt()
val mRectL = getPaddingLeft() + (viewWide - mRectLength) / 2
val mRectT = getPaddingTop() + (viewHigh - mRectLength) / 2
val mRectL = paddingLeft + (viewWide - mRectLength) / 2
val mRectT = paddingTop + (viewHigh - mRectLength) / 2
mRectF = RectF(mRectL.toFloat(), mRectT.toFloat(), (mRectL + mRectLength).toFloat(),
(mRectT + mRectLength).toFloat())
@@ -94,13 +92,13 @@ class CircularProgressView @JvmOverloads constructor(
return
}
val position = FloatArray(2)
position[0] = 0.0f;
position[0] = 0.0f
position[1] = mProgress.toFloat() * 0.01f
val sweepGradient = SweepGradient((measuredWidth / 2).toFloat(), (measuredHeight / 2).toFloat(), mConvertColorsArray!!, position)
val matrix = Matrix()
matrix.setRotate(-90F, (measuredWidth / 2).toFloat(), (measuredHeight / 2).toFloat())
sweepGradient.setLocalMatrix(matrix);
mProgPaint.setShader(sweepGradient)
mProgPaint.shader = sweepGradient
}
override fun onDraw(canvas: Canvas?) {
@@ -109,7 +107,7 @@ class CircularProgressView @JvmOverloads constructor(
mRectF?.let { it1 -> it.drawArc(it1, 0.0f, 360.0f, false, mBackPaint) }
mRectF?.let { it1 ->
sweepGradient()
var degree: Float = 3.6f * (mProgress.toFloat())
val degree: Float = 3.6f * (mProgress.toFloat())
if(mProgress>=0) {
it.drawArc(it1, 275.0f, degree, false, mProgPaint)
}else{
@@ -121,8 +119,8 @@ class CircularProgressView @JvmOverloads constructor(
}
fun setBlurMaskFilter(blur: BlurMaskFilter.Blur, radius: Float) {
var blur: BlurMaskFilter = BlurMaskFilter(radius, blur)
mProgPaint.setMaskFilter(blur)
val temp = BlurMaskFilter(radius, blur)
mProgPaint.maskFilter = temp
invalidate()
}
@@ -222,12 +220,11 @@ class CircularProgressView @JvmOverloads constructor(
return
}
mConvertColorsArray = it.copyOf()
mConvertColorsArray?.let {
mConvertColorsArray?.let { color ->
mProgPaint.shader = LinearGradient(0f, 0f, 0f,
getMeasuredWidth().toFloat(), it, null, Shader.TileMode.MIRROR)
measuredWidth.toFloat(), color, null, Shader.TileMode.MIRROR)
}
}
}
}

View File

@@ -2,14 +2,13 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.LimitingVelocityView_TAG
import com.mogo.eagle.core.function.api.v2x.ILimitingVelocityListener
import com.mogo.eagle.core.function.api.datacenter.union.ILimitingVelocityListener
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.v2x.CallerLimitingVelocityListenerManager
import com.mogo.eagle.core.function.hmi.R
@@ -43,7 +42,6 @@ class LimitingVelocityView constructor(
if (limitingVelocity > 0) {
visibility = View.VISIBLE
tvLimitingVelocity.text = "$limitingVelocity"
Log.d("emArrow","limit : ${ DataSourceType.getName(sourceType)}")
tvLimitingSource.text = DataSourceType.getName(sourceType)
} else {
visibility = View.GONE

View File

@@ -13,7 +13,7 @@ import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.enums.TrafficLightEnum
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.TrafficLightView_TAG
import com.mogo.eagle.core.function.api.v2x.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager
import com.mogo.eagle.core.function.hmi.R

View File

@@ -8,12 +8,11 @@ import android.widget.FrameLayout
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.api.v2x.ILimitingVelocityListener
import com.mogo.eagle.core.function.api.datacenter.union.ILimitingVelocityListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
import com.mogo.eagle.core.function.call.v2x.CallerLimitingVelocityListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import java.util.*
class SpeedPanelView @JvmOverloads constructor(
context: Context,

View File

@@ -0,0 +1,192 @@
package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.graphics.BlurMaskFilter
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.animation.RotateAnimation
import android.widget.ImageView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import chassis.Chassis.GearPosition
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisGearStateListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisSteeringStateListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisGearStateListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisSteeringStateListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isBus
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isTaxi
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import kotlin.math.abs
/**
* @author Jing
* @description 方向盘
* 方向盘跟随CAN数据做旋转
* 档位随CAN数据做切换和高亮显示
* @since: 4/7/22
*/
class SteeringWheelView : ConstraintLayout, IMoGoChassisSteeringStateListener,
IMoGoChassisGearStateListener {
private var autopilotIV: ImageView? = null
private var steeringTVL: TextView? = null
private var steeringTVR: TextView? = null
private var tapPositionView: TapPositionView? = null
private var steeringCircularV: CircularProgressView? = null
private var steeringCircularVAlpha: CircularProgressView? = null
private var rotateAnimation: RotateAnimation? = null
private var fromDegrees = 0f //方向盘旋转起始位置
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
if (isBus(FunctionBuildConfig.appIdentityMode)) {
LayoutInflater.from(context).inflate(R.layout.hmi_steering_wheel_bus, this)
} else {
LayoutInflater.from(context).inflate(R.layout.hmi_steering_wheel_taxi, this)
}
initView()
CallerAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener)
CallerChassisGearStateListenerManager.addListener(TAG, this)
CallerChassisSteeringStateListenerManager.addListener(TAG, this)
tapPositionView?.updateWithGear(GearPosition.GEAR_R)
}
private fun initView() {
autopilotIV = findViewById<View>(R.id.autopilot_iv) as ImageView
steeringTVL = findViewById(R.id.steering_tv_left)
steeringTVR = findViewById(R.id.steering_tv_right)
tapPositionView = findViewById(R.id.tap_position)
steeringCircularV = findViewById(R.id.steering_circular)
steeringCircularV?.setBackWidth(8)
steeringCircularV?.setBackColor(R.color.hmi_light_back_bg)
steeringCircularV?.setProgress((0 * 100) / 360, 20)
steeringCircularV?.setProgColor(R.color.hmi_light_blue, R.color.hmi_dark_blue)
if (isTaxi(FunctionBuildConfig.appIdentityMode)) {
steeringCircularVAlpha = findViewById(R.id.steering_circular_alpha)
steeringCircularVAlpha?.setProgress((0 * 100) / 360, 20)
steeringCircularV?.setProgColor(R.color.hmi_dark_blue, R.color.hmi_light_blue)
steeringCircularVAlpha?.setBackWidth(8)
steeringCircularVAlpha?.setBackColor(R.color.hmi_clear_00)
steeringCircularVAlpha?.setProgColor(
R.color.hmi_light_blue_alpha_ff,
R.color.hmi_light_blue_alpha_00
)
steeringCircularVAlpha?.setBlurMaskFilter(BlurMaskFilter.Blur.NORMAL, 12f)
}
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
) {
}
private val mGoAutopilotStatusListener: IMoGoAutopilotStatusListener =
object : IMoGoAutopilotStatusListener {
override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {
ThreadUtils.runOnUiThread {
val state = autoPilotStatusInfo.state
d("$M_BUS_P$TAG", "state = %s", state)
if (autopilotIV != null) {
if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
if (!isBus(FunctionBuildConfig.appIdentityMode)) {
autopilotIV?.setImageResource(R.drawable.bg_auto)
}
} else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
if (!isBus(FunctionBuildConfig.appIdentityMode)) {
autopilotIV?.setImageResource(R.drawable.bg_auto_nor)
}
} else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
if (!isBus(FunctionBuildConfig.appIdentityMode)) {
autopilotIV?.setImageResource(R.drawable.bg_auto_nor)
}
}
} else {
d("$M_BUS_P$TAG", "autopilotIV=null")
}
}
}
}
/**
* 方向盘转向角 左+右-
* @param steering
*/
override fun onAutopilotSteeringData(steering: Float) {
var temp = steering
if (abs(steering) < 1) {
temp = 0f
}
val steeringValue = temp
ThreadUtils.runOnUiThread {
if (steeringTVL != null && steeringValue > 0) {
steeringTVR?.visibility = INVISIBLE
steeringTVL?.visibility = VISIBLE
steeringTVL?.text = "${steeringValue}°"
} else if (steeringTVR != null && steeringValue <= 0) {
steeringTVL?.visibility = INVISIBLE
steeringTVR?.visibility = VISIBLE
steeringTVR?.text = "${-steeringValue}°"
} else {
d(TAG, "onAutopilotSteeringData error")
}
animationWithSteeringData(-steeringValue)
if (steeringCircularV != null) {
steeringCircularV?.setProgress((-steeringValue * 100).toInt() / 360, 20)
}
if (steeringCircularVAlpha != null) {
steeringCircularVAlpha?.setProgress((-steeringValue * 100).toInt() / 360, 20)
}
}
}
/**
* 档位
* @param gear
*/
override fun onAutopilotGearData(gear: GearPosition) {
ThreadUtils.runOnUiThread {
d(TAG, "乘客屏档位$gear")
if (tapPositionView != null) {
tapPositionView?.updateWithGear(gear)
}
}
}
/**
* 方向盘随CAN数据做方向和角度旋转
* 参数1从哪一个旋转角度开始
* 参数2转到什么角度
* 后4个参数用于设置围绕着旋转的圆的圆心在哪里
* 参数3肯定x轴坐标的类型有ABSOLUT绝对坐标、RELATIVE_TO_SELF相对于自身坐标、RELATIVE_TO_PARENT相对于父控件的坐标
* 参数4x轴的值0.5f代表是以自身这个控件的一半长度为x轴
* 参数5肯定y轴坐标的类型
* 参数6y轴的值0.5f代表是以自身这个控件的一半长度为x轴
*
* @param steering
*/
private fun animationWithSteeringData(steering: Float) {
rotateAnimation = RotateAnimation(
fromDegrees, steering,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f
)
rotateAnimation?.duration = 20 //旋转时长
rotateAnimation?.fillAfter = true //旋转后保持原状
autopilotIV?.clearAnimation()
autopilotIV?.startAnimation(rotateAnimation)
fromDegrees = steering
}
companion object {
private const val TAG = "SteeringWheelView"
}
}

View File

@@ -10,10 +10,14 @@ import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.api.hmi.autopilot.IMoGoCheckAutoPilotBtnListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.map.OfflineMapDialog
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.AppUtils
@@ -33,7 +37,7 @@ class SystemVersionView @JvmOverloads constructor(
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener,
IMoGoDevaToolsListener {
IMoGoDevaToolsListener, IMoGoCheckAutoPilotBtnListener {
companion object {
const val TAG = "SystemVersionView"
@@ -50,6 +54,8 @@ class SystemVersionView @JvmOverloads constructor(
private var previousProgress: Int = -1 //前一秒的下载进度,用于计算下载剩余时间
private var currentProgress: Int = -1 //当前已下载包体大小
private var isHDCached = false
init {
LayoutInflater.from(context).inflate(R.layout.view_system_version, this, true)
initView()
@@ -63,14 +69,6 @@ class SystemVersionView @JvmOverloads constructor(
ivPadVersion.setOnClickListener {
CallerLogger.i("$M_HMI$$TAG", "pad version view clicked")
CallerDevaToolsManager.queryAppUpgrade()
//弹框和下载回调
// showUpgradeDialog(
// "",
// "",
// "",
// "",
// "1"
// )
}
//工控机版本视图点击事件
@@ -135,6 +133,16 @@ class SystemVersionView @JvmOverloads constructor(
}
ivHDCache.setOnClickListener {
if (isHDCached) {// 已缓存
ToastUtils.showShort(resources.getString(R.string.offline_had_downloaded))
} else {// 未缓存
OfflineMapDialog(context).show()
}
}
updateHDDataCacheStatus(CallerMapUIServiceManager.isCityDataCached())
if(AdUpgradeStateHelper.isConfirmUpgrade()){
//将角标改为“下载中”
ivAdStatus?.setImageResource(R.drawable.icon_downloading)
@@ -239,6 +247,15 @@ class SystemVersionView @JvmOverloads constructor(
}
override fun updateHDDataCacheStatus(isCached: Boolean) {
if (isCached) {
ivHDCacheStatus?.setImageResource(R.drawable.icon_latest_version)
} else {
ivHDCacheStatus?.setImageResource(R.drawable.icon_be_updated)
}
isHDCached = isCached
}
/**
* 展示当前鹰眼版本
*/
@@ -267,6 +284,7 @@ class SystemVersionView @JvmOverloads constructor(
if (isInEditMode) {
return
}
CallerHmiListenerManager.addListener(TAG, this)
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerDevaToolsListenerManager.addListener(TAG,this)
needQueryContainers = true
@@ -277,6 +295,7 @@ class SystemVersionView @JvmOverloads constructor(
if (isInEditMode) {
return
}
CallerHmiListenerManager.removeListener(TAG)
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerDevaToolsListenerManager.removeListener(TAG)
needQueryContainers = false

View File

@@ -60,7 +60,7 @@ class VersionNameView @JvmOverloads constructor(
@SuppressLint("SetTextI18n")
private fun showCurrentPadVersion() {
tvAppVersionName?.let {
// it.text = "APP:${AppUtils.getAppVersionName()}"
it.text = "APP:${AppUtils.getAppVersionName()}"
}
}

View File

@@ -14,7 +14,7 @@ import com.kwai.koom.nativeoom.leakmonitor.LeakListener
import com.kwai.koom.nativeoom.leakmonitor.LeakMonitor.start
import com.kwai.koom.nativeoom.leakmonitor.LeakMonitorConfig
import com.kwai.koom.nativeoom.leakmonitor.LeakRecord
import com.mogo.commons.analytics.AnalyticsUtils
import com.mogo.commons.utils.MogoAnalyticUtils
import com.mogo.commons.context.ContextHolderUtil
import com.mogo.commons.debug.DebugConfig
import com.mogo.commons.module.status.MogoStatusManager
@@ -169,7 +169,7 @@ open class MainActivity : MvpActivity<MainView?, MainPresenter?>(), MainView,
properties["app_launch_hotStartTime"] = hotStartTime
}
}
AnalyticsUtils.track("app_launch_time", properties)
MogoAnalyticUtils.track("app_launch_time", properties)
}
}

View File

@@ -3,7 +3,6 @@ package com.mogo.eagle.core.function.main;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_START_UP;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_INIT;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_F;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAIN;
@@ -21,20 +20,15 @@ import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.module.intent.IMogoIntentListener;
import com.mogo.commons.module.intent.IntentManager;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.mofang.MfConstants;
import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider;
import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener;
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.mofang.CallerMofangListenerManager;
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager;
import com.mogo.eagle.core.function.hmi.R;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
import com.mogo.eagle.core.utilcode.util.ActivityUtils;
import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.rousetime.android_startup.model.CostTimesModel;
import com.zhjt.service.chain.ChainLog;
import com.zhjt.service.chain.TracingConstants;
@@ -43,8 +37,6 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* 针对作为Launcher的情况做个性化操作
@@ -57,31 +49,6 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis
private final static Handler handlerV2XEvent = new Handler();
private static Runnable runnableV2XEvent;
private volatile double accelerated;//加速度
private Timer timerHorn;
private Timer timerAcc;
private boolean isShowToast = false; //toast 控制
private long startPressTime = 0; //开始按减时间
private boolean isPressEnd = false; //按键是否结束
private volatile int isCombinationKey = 0; //是否是组合按键 1单击2长按3组合
private long pressADownTime = 0;
private long pressAUpTime = 0;
private long pressBDownTime = 0;
private long pressBUpTime = 0;
private long pressCDownTime = 0;
private long pressCUpTime = 0;
private long pressDDownTime = 0;
private long pressDUpTime = 0;
private long pressEDownTime = 0;
private long pressEUpTime = 0;
private int clickTime = 300; //单击
private int clickTimeInterval = 330;
private int longPressTime = 670;
private int longPressTimeInterval = 700;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -240,200 +207,15 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent code = " + event.getKeyCode() + "--action = " + event.getAction() + "----" + event);
String bluetoothName = SharedPrefsMgr.getInstance(getContext()).getString(MfConstants.BLUETOOTH_NAME);
if (!isPressEnd) {
CallerLogger.INSTANCE.d(M_F + "MoFangManager","dispatchKeyEvent ---1--- bluetoothName = " + bluetoothName);
if(CallerMofangListenerManager.INSTANCE.invokeMofangHandle(event.getKeyCode(), event.getAction())) {
return true;
} else {
return super.dispatchKeyEvent(event);
}
if (bluetoothName.equals("MINI_KEYBOARD")) {
if (!isPressEnd) {
isPressEnd = true;
startPressTime = System.currentTimeMillis();
}
CallerLogger.INSTANCE.d(M_F + "MoFangManager","dispatchKeyEvent ---2--- bluetoothName = " + bluetoothName + "--- code = " + event.getKeyCode() + "--action = " + event.getAction());
if (event.getKeyCode() == KeyEvent.KEYCODE_A) { //单击 -1长按无操作AB组合-2
if (event.getAction() == KeyEvent.ACTION_DOWN) {
pressADownTime = System.currentTimeMillis();
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent A down pressADownTime = " + pressADownTime + "---" + (pressADownTime - startPressTime) + "----isCombinationKey = " + isCombinationKey + "--pressBDownTime = " + pressBDownTime);
if ((pressADownTime - startPressTime) > clickTimeInterval && (pressADownTime - startPressTime) < longPressTime && pressBDownTime > 0) {
if (isShowToast) {
ToastUtils.showShort("方块 A 按AB组合 +1 ");
}
sendAcc(true, +1);
isCombinationKey = 3;
}
if (isCombinationKey != 3 && isCombinationKey != 1) {
if ((pressADownTime - startPressTime) > longPressTimeInterval) {
if (isShowToast) {
ToastUtils.showShort("方块 长按A -2 ");
}
sendAcc(true, -2);
isCombinationKey = 2;
}
}
} else if (event.getAction() == KeyEvent.ACTION_UP) {
pressAUpTime = System.currentTimeMillis();
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent A up pressAUpTime = " + pressAUpTime + "---" + (pressAUpTime - startPressTime) + "--pressBDownTime = " + pressBDownTime);
if ((pressAUpTime - startPressTime) < clickTime && isCombinationKey != 3) {
isCombinationKey = 1;
if (isShowToast) {
ToastUtils.showShort("方块 单击A -1 ");
}
sendAcc(true, -1);
}
pressADownTime = 0;
isPressEnd = false;
UiThreadHandler.postDelayed(new Runnable() {
@Override
public void run() {
isCombinationKey = 0;
}
}, 300);
}
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_B) { //单击复原,长按+1AB组合-2
if (event.getAction() == KeyEvent.ACTION_DOWN) {
pressBDownTime = System.currentTimeMillis();
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent B down pressBDownTime = " + pressBDownTime + "--差-" + (pressBDownTime - startPressTime) + "---isCombinationKey = " + isCombinationKey + "--pressADownTime = " + pressADownTime);
if ((pressBDownTime - startPressTime) > clickTimeInterval && (pressBDownTime - startPressTime) < longPressTime && pressADownTime > 0) {
if (isShowToast) {
ToastUtils.showShort("方块 B 按AB组合 +1 ");
}
sendAcc(true, +1);
isCombinationKey = 3;
}
if (isCombinationKey != 3 && isCombinationKey != 1) {
if ((pressBDownTime - startPressTime) > longPressTimeInterval) {
if (isShowToast) {
ToastUtils.showShort("方块 长按B 无操作 ");
}
isCombinationKey = 2;
}
}
} else if (event.getAction() == KeyEvent.ACTION_UP) {
pressBUpTime = System.currentTimeMillis();
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent B up pressBUpTime = " + pressBUpTime + "--差-" + (pressBUpTime - startPressTime) + "--pressADownTime = " + pressADownTime);
if ((pressBUpTime - startPressTime) < clickTime && isCombinationKey != 3) {
if (isShowToast) {
ToastUtils.showShort("方块 单击B 0 ");
}
sendAcc(false, 0.0);
isCombinationKey = 1;
}
pressBDownTime = 0;
isPressEnd = false;
UiThreadHandler.postDelayed(new Runnable() {
@Override
public void run() {
isCombinationKey = 0;
}
}, 300);
}
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_C) { //单击左变道,长按无操作
if (event.getAction() == KeyEvent.ACTION_DOWN) {
pressCDownTime = System.currentTimeMillis();
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按C 无操作 time dif = " + (pressCDownTime - startPressTime));
if ((pressCDownTime - startPressTime) > longPressTimeInterval) {
if (isShowToast) {
ToastUtils.showShort("方块 长按C 无操作 ");
}
}
} else if (event.getAction() == KeyEvent.ACTION_UP) {
pressCUpTime = System.currentTimeMillis();
isPressEnd = false;
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 单击C ← 向左变道 time dif = " + (pressCUpTime - startPressTime));
if ((pressCUpTime - startPressTime) < clickTime) {
if (isShowToast) {
ToastUtils.showShort("方块 单击C ← 向左变道 ");
}
CallerAutoPilotControlManager.INSTANCE.sendOperatorChangeLaneLeft();
}
}
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_D) { //单击向右变道,双击无操作
if (event.getAction() == KeyEvent.ACTION_DOWN) {
pressDDownTime = System.currentTimeMillis();
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按D 无操作 time dif = " + (pressDDownTime - startPressTime));
if ((pressDDownTime - startPressTime) > longPressTimeInterval) {
if (isShowToast) {
ToastUtils.showShort("方块 长按D 无操作 ");
}
}
} else if (event.getAction() == KeyEvent.ACTION_UP) {
pressDUpTime = System.currentTimeMillis();
isPressEnd = false;
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 单击D → 向右变道 time dif = " + (pressDUpTime - startPressTime));
if ((pressDUpTime - startPressTime) < clickTime) {
if (isShowToast) {
ToastUtils.showShort("方块 单击D → 向右变道 ");
}
CallerAutoPilotControlManager.INSTANCE.sendOperatorChangeLaneRight();
}
}
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_E) { //单击启动自驾,长按鸣笛
if (event.getAction() == KeyEvent.ACTION_DOWN) {
pressEDownTime = System.currentTimeMillis();
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按E 鸣笛 time dif = " + (pressEDownTime - startPressTime));
if ((pressEDownTime - startPressTime) > longPressTimeInterval) {
if (isShowToast) {
ToastUtils.showShort("方块 长按E 鸣笛 ");
}
CallerAutoPilotControlManager.INSTANCE.sendOperatorSetHorn(1);
if (timerHorn == null) {
timerHorn = new Timer();
}
timerHorn.schedule(new TimerTask() {
@Override
public void run() {
CallerAutoPilotControlManager.INSTANCE.sendOperatorSetHorn(2);
timerHorn = null;
}
}, 500);
}
} else if (event.getAction() == KeyEvent.ACTION_UP) {
pressEUpTime = System.currentTimeMillis();
isPressEnd = false;
CallerLogger.INSTANCE.d(M_F + "MoFangManager", "方块 单击E 开启自动驾驶 time dif = " + (pressEUpTime - startPressTime));
if ((pressEUpTime - startPressTime) < clickTime) {
if (isShowToast) {
ToastUtils.showShort("方块 单击E 开启自动驾驶 ");
}
CallerAutoPilotControlManager.INSTANCE.startAutoPilot(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getAutopilotControlParameters());
}
}
return true;
}
}
return super.dispatchKeyEvent(event);
}
@Override
public void onSkinModeChange(int skinMode) {
}
private synchronized void sendAcc(boolean isSend, double acc) {
if (isSend) {
accelerated = acc;
if (timerAcc == null) {
timerAcc = new Timer();
timerAcc.schedule(new TimerTask() {
@Override
public void run() {
CallerAutoPilotControlManager.INSTANCE.sendOperatorSetAcceleratedSpeed(accelerated);
}
}, 0, 500);
}
} else {
if (timerAcc != null) {
timerAcc.cancel();
timerAcc = null;
}
CallerAutoPilotControlManager.INSTANCE.sendOperatorSetAcceleratedSpeed(acc);
}
}
}

View File

@@ -9,8 +9,10 @@ import android.os.Process;
import com.bytedance.boost_multidex.BoostMultiDex;
import com.mogo.cloud.socket.SocketBuildConfig;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.module.MogoModule;
import com.mogo.commons.module.MogoModulePaths;
import com.mogo.commons.utils.MogoAnalyticUtils;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.function.api.chat.biz.ChatConsts;
@@ -111,6 +113,8 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
} catch (Exception e) {
e.printStackTrace();
}
// 初始化埋点
MogoAnalyticUtils.INSTANCE.init(this, DebugConfig.isDebug());
SocketBuildConfig.isPrintLog = false;
// 初始化DevaTools,开始链路记录
CallerDevaToolsManager.INSTANCE.init();
@@ -124,8 +128,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_FUNC_BIZ, "IMoGoNoticeProvider"));
// todo 后置 车聊聊IM
MogoModulePaths.addModuleFunctionServer(new MogoModule(ChatConsts.CHAT_PROVIDER_PATH, ChatConsts.CHAT_MODULE_NAME));
// V2X 模块
MogoModulePaths.addBaseModule(new MogoModule(MogoServicePaths.PATH_V2X_MODULE, "V2XProvider"));
// 司机身份专属
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
// todo 后置 地图数据收集模块

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置背景色 -->
<item android:id="@android:id/background">
<shape>
<corners android:radius="21dp" />
<solid android:color="@android:color/transparent" />
<stroke android:color="#7CF6FF" android:width="2dp" />
</shape>
</item>
<!-- <item android:id="@android:id/secondaryProgress"-->
<!-- android:start="1.5dp"-->
<!-- android:end="1.5dp"-->
<!-- android:top="1.5dp"-->
<!-- android:bottom="1.5dp"-->
<!-- >-->
<!-- <scale android:scaleWidth="100%">-->
<!-- <shape>-->
<!-- <corners android:radius="21dp" />-->
<!-- <solid android:color="@android:color/holo_green_light" />-->
<!-- </shape>-->
<!-- </scale>-->
<!-- </item>-->
<!-- 设置进度条颜色 -->
<item android:id="@android:id/progress"
android:start="2dp"
android:end="2dp"
android:top="2dp"
android:bottom="2dp"
>
<scale android:scaleWidth="100%">
<shape>
<corners android:radius="21dp" />
<gradient
android:angle="0"
android:endColor="#00E5FF"
android:startColor="#374171" />
</shape>
</scale>
</item>
</layer-list>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFC0C7DA"/>
<size android:height="1dp" />
</shape>

View File

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

View File

@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/roundRootLayout"
android:layout_width="840dp"
android:layout_height="488dp"
android:background="@color/dialog_bg_color_90_percent"
app:roundLayoutRadius="32dp">
<TextView
android:id="@+id/tv_cache_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="66dp"
android:text="@string/offline_map_cache_tip"
android:textColor="#FFFFFF"
android:textSize="56dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_cache_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:text="@string/cache_offline_map_content"
android:textColor="#FFFFFFFF"
android:textSize="43dp"
android:visibility="visible"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_cache_title" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="800dp"
android:layout_height="42dp"
style="?android:attr/progressBarStyleHorizontal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_cache_title"
android:layout_marginTop="113dp"
android:max="100"
android:progress="0"
android:progressDrawable="@drawable/progressbar_corner_bg"
android:visibility="gone"
/>
<TextView
android:id="@+id/tvDownloadProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/progressBar"
android:layout_marginTop="50dp"
android:text="0%"
android:textColor="#06D1ED"
android:textSize="43dp"
android:visibility="gone"
/>
<ImageView
android:id="@+id/iv_download_Status"
android:layout_width="174dp"
android:layout_height="174dp"
android:layout_marginTop="96dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_cache_title"
android:visibility="gone"
/>
<View
android:id="@+id/view_horizontal_line"
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="205dp"
android:background="#66B8BFE8"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_cache_title" />
<View
android:id="@+id/view_vertical_line"
android:layout_width="2dp"
android:layout_height="0dp"
android:background="#66B8BFE8"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_line" />
<TextView
android:id="@+id/tv_cache_confirm"
android:layout_width="419dp"
android:layout_height="137dp"
android:gravity="center"
android:text="@string/confirm"
android:textColor="#FFFFFFFF"
android:textSize="46dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/view_vertical_line"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_line" />
<TextView
android:id="@+id/tv_cache_cancel"
android:layout_width="419dp"
android:layout_height="137dp"
android:gravity="center"
android:text="@string/cancel"
android:textColor="#FFFFFFFF"
android:textSize="46dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/view_vertical_line"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_line" />
<TextView
android:id="@+id/tv_cache_ok"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
android:text="@string/ok_tip"
android:textColor="#FFFFFFFF"
android:textSize="46dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/view_vertical_line"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_line" />
</com.mogo.eagle.core.widget.RoundConstraintLayout>

View File

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dp_450"
android:layout_height="@dimen/dp_110"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#FFFFFFFF"
app:roundLayoutRadius="@dimen/dp_18"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_10"
>
<ImageView
android:id="@+id/ivMNoticeImage"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_110"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:src="@drawable/icon_passenger_operation"
/>
<TextView
android:id="@+id/tvMNoticeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="官方公告"
android:textColor="#FF203555"
android:textSize="@dimen/dp_25"
android:textStyle="bold"
android:layout_marginStart="@dimen/dp_10"
app:layout_constraintLeft_toRightOf="@id/ivMNoticeImage"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/tvMNoticeContent"
/>
<TextView
android:id="@+id/tvMNoticeContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="#CC203555"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="@id/tvMNoticeTitle"
app:layout_constraintTop_toBottomOf="@id/tvMNoticeTitle"
app:layout_constraintRight_toRightOf="@id/tvMNoticeTime"
android:gravity="start"
android:maxLines="1"
android:ellipsize="end"
/>
<TextView
android:id="@+id/tvMNoticeCheck"
android:layout_width="@dimen/dp_100"
android:layout_height="@dimen/dp_110"
android:text="查 看"
android:textColor="#FF1366FB"
android:textSize="@dimen/dp_20"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:gravity="center"
/>
<View
android:layout_width="1dp"
android:layout_height="64dp"
android:background="#FFC0C7DA"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tvMNoticeCheck"
/>
<TextView
android:id="@+id/tvMNoticeTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#B34A5B77"
android:textSize="@dimen/dp_18"
app:layout_constraintTop_toTopOf="@id/tvMNoticeTitle"
app:layout_constraintBottom_toBottomOf="@id/tvMNoticeTitle"
app:layout_constraintRight_toLeftOf="@id/tvMNoticeCheck"
android:layout_marginEnd="@dimen/dp_15"
/>
</com.mogo.eagle.core.widget.RoundConstraintLayout>

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="450dp"
android:layout_height="110dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#FFFFFFFF"
app:roundLayoutRadius="@dimen/dp_18"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_10"
>
<ImageView
android:id="@+id/ivMSummaryImage"
android:layout_width="110dp"
android:layout_height="110dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:src="@drawable/icon_passenger_operation"
/>
<TextView
android:id="@+id/tvMSummaryTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蘑菇小助手"
android:textColor="#FF203555"
android:textSize="25dp"
android:layout_marginStart="10dp"
app:layout_constraintLeft_toRightOf="@id/ivMSummaryImage"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/tvMSummaryContent"
/>
<TextView
android:id="@+id/tvMSummaryContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="#CC203555"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="@id/tvMSummaryTitle"
app:layout_constraintTop_toBottomOf="@id/tvMSummaryTitle"
app:layout_constraintRight_toRightOf="@id/tvMSummaryTime"
android:gravity="start"
/>
<TextView
android:id="@+id/tvMSummaryCheck"
android:layout_width="110dp"
android:layout_height="110dp"
android:text="查 看"
android:textColor="#FF1366FB"
android:textSize="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:gravity="center"
/>
<View
android:layout_width="1dp"
android:layout_height="64dp"
android:background="#C0C7DA"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tvMSummaryCheck"
/>
<TextView
android:id="@+id/tvMSummaryTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#B34A5B77"
android:textSize="18dp"
app:layout_constraintTop_toTopOf="@id/tvMSummaryTitle"
app:layout_constraintBottom_toBottomOf="@id/tvMSummaryTitle"
app:layout_constraintRight_toLeftOf="@id/tvMSummaryCheck"
android:layout_marginEnd="10dp"
/>
</com.mogo.eagle.core.widget.RoundConstraintLayout>

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundCanClickConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/clMVeXLayout"
android:layout_width="450dp"
android:layout_height="110dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#FFFFFFFF"
app:roundLayoutRadius="@dimen/dp_18"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_10">
<ImageView
android:id="@+id/ivMV2XImage"
android:layout_width="@dimen/dp_83"
android:layout_height="@dimen/dp_83"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginStart="@dimen/dp_13"
/>
<TextView
android:id="@+id/tvMV2XTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:textColor="#99203555"
android:textSize="18dp"
android:layout_marginEnd="@dimen/dp_20"
/>
<TextView
android:id="@+id/tvMV2XContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/ivMV2XImage"
app:layout_constraintRight_toLeftOf="@id/tvMV2XTime"
android:gravity="start"
android:maxLines="1"
android:ellipsize="end"
android:textColor="#FF203555"
android:textSize="25dp"
android:textStyle="bold"
android:layout_marginStart="@dimen/dp_13"
android:layout_marginEnd="@dimen/dp_13"
/>
</com.mogo.eagle.core.widget.RoundCanClickConstraintLayout>

View File

@@ -0,0 +1,83 @@
<?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="@dimen/dp_100"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/ivMNoticeImage"
android:layout_width="@dimen/dp_68"
android:layout_height="@dimen/dp_68"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:src="@drawable/icon_passenger_operation"
android:layout_marginStart="@dimen/dp_16"
/>
<TextView
android:id="@+id/tvMNoticeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="官方公告"
android:textColor="#FF203555"
android:textSize="@dimen/dp_25"
android:layout_marginStart="@dimen/dp_16"
app:layout_constraintLeft_toRightOf="@id/ivMNoticeImage"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/tvMNoticeContent"
android:textStyle="bold"
/>
<TextView
android:id="@+id/tvMNoticeContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="#CC203555"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="@id/tvMNoticeTitle"
app:layout_constraintTop_toBottomOf="@id/tvMNoticeTitle"
app:layout_constraintRight_toRightOf="@id/tvMNoticeTime"
android:gravity="start"
android:maxLines="1"
android:ellipsize="end"
/>
<TextView
android:id="@+id/tvMNoticeCheck"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_100"
android:text="查 看"
android:textColor="#FF1366FB"
android:textSize="20dp"
android:paddingEnd="@dimen/dp_10"
android:paddingStart="@dimen/dp_20"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:gravity="center"
/>
<View
android:layout_width="@dimen/dp_1"
android:layout_height="@dimen/dp_55"
android:background="#FFC0C7DA"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tvMNoticeCheck"
/>
<TextView
android:id="@+id/tvMNoticeTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF4A5B76"
android:textSize="@dimen/dp_18"
app:layout_constraintTop_toTopOf="@id/tvMNoticeTitle"
app:layout_constraintBottom_toBottomOf="@id/tvMNoticeTitle"
app:layout_constraintRight_toLeftOf="@id/tvMNoticeCheck"
android:layout_marginEnd="@dimen/dp_15"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,79 @@
<?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="@dimen/dp_100"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/ivMSummaryImage"
android:layout_width="68dp"
android:layout_height="68dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:src="@drawable/icon_passenger_operation"
android:layout_marginStart="@dimen/dp_16"
/>
<TextView
android:id="@+id/tvMSummaryTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蘑菇小助手"
android:textColor="#FF203555"
android:textSize="25dp"
android:layout_marginStart="20dp"
app:layout_constraintLeft_toRightOf="@id/ivMSummaryImage"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/tvMSummaryContent"
/>
<TextView
android:id="@+id/tvMSummaryContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="#CC203555"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvMSummaryTitle"
app:layout_constraintLeft_toLeftOf="@id/tvMSummaryTitle"
app:layout_constraintRight_toRightOf="@id/tvMSummaryTime"
android:gravity="start"
/>
<TextView
android:id="@+id/tvMSummaryCheck"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="查 看"
android:textColor="#FF1366FB"
android:textSize="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:gravity="center"
/>
<View
android:layout_width="1dp"
android:layout_height="50dp"
android:background="#C0C7DA"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tvMSummaryCheck"
/>
<TextView
android:id="@+id/tvMSummaryTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#CC203555"
android:textSize="18dp"
app:layout_constraintTop_toTopOf="@id/tvMSummaryTitle"
app:layout_constraintBottom_toBottomOf="@id/tvMSummaryTitle"
app:layout_constraintRight_toLeftOf="@id/tvMSummaryCheck"
android:layout_marginEnd="10dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,47 @@
<?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="@dimen/dp_100"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/ivMV2XImage"
android:layout_width="@dimen/dp_68"
android:layout_height="@dimen/dp_68"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginStart="@dimen/dp_16"
/>
<TextView
android:id="@+id/tvMV2XTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:textColor="#FF4A5B76"
android:textSize="@dimen/dp_18"
android:layout_marginEnd="@dimen/dp_10"
/>
<TextView
android:id="@+id/tvMV2XContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/ivMV2XImage"
app:layout_constraintRight_toLeftOf="@id/tvMV2XTime"
android:textStyle="bold"
android:gravity="start"
android:maxLines="1"
android:ellipsize="end"
android:textColor="#FF203555"
android:textSize="@dimen/dp_25"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -70,7 +70,7 @@
android:id="@+id/tvStatusSelect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="折叠"
android:text="展开"
android:textColor="#FFFFFFFF"
android:textSize="24dp"
app:layout_constraintTop_toTopOf="parent"
@@ -163,12 +163,26 @@
/>
<TextView
android:id="@+id/tvReportActionOpen"
android:id="@+id/tvReportSrcOpen"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvReportReasonOpen"
app:layout_constraintLeft_toLeftOf="@id/tvReportReasonOpen"
app:layout_constraintRight_toRightOf="@id/tvStatusSelect"
android:textColor="#B3FFFFFF"
android:textSize="28dp"
android:gravity="start"
android:lineSpacingMultiplier="1.2"
android:visibility="gone"
/>
<TextView
android:id="@+id/tvReportActionOpen"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvReportSrcOpen"
app:layout_constraintLeft_toLeftOf="@id/tvReportSrcOpen"
app:layout_constraintRight_toRightOf="@id/tvStatusSelect"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="15dp"
android:textColor="#B3FFFFFF"

View File

@@ -59,7 +59,7 @@
android:id="@+id/tvOperationStatusSelect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="折叠"
android:text="展开"
android:textColor="#FFFFFFFF"
android:textSize="24dp"
app:layout_constraintTop_toTopOf="parent"

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rvMBubbleList"
android:layout_width="@dimen/dp_450"
android:layout_height="wrap_content"
>
</androidx.recyclerview.widget.RecyclerView>

View File

@@ -0,0 +1,38 @@
<LinearLayout
android:layout_width="@dimen/dp_450"
android:layout_height="@dimen/dp_520"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
>
<com.mogo.eagle.core.function.hmi.ui.msgbox.SharpView
android:layout_width="@dimen/dp_25"
android:layout_height="@dimen/dp_25"
android:layout_gravity="end"
android:layout_marginEnd="@dimen/dp_35"
/>
<com.mogo.eagle.core.widget.RoundConstraintLayout
android:layout_width="@dimen/dp_450"
android:layout_height="@dimen/dp_490"
android:background="#FFFFFFFF"
app:roundLayoutRadius="@dimen/dp_18"
>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginStart="@dimen/dp_18"
android:layout_marginEnd="@dimen/dp_18"
/>
</com.mogo.eagle.core.widget.RoundConstraintLayout>
</LinearLayout>

View File

@@ -1008,7 +1008,7 @@
style="@style/DebugSettingText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="挂档位:" />
android:text="挂档位:" />
<View
android:layout_width="match_parent"

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dp_148"
android:layout_height="@dimen/dp_148"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<!--消息盒子M1选择入口-->
<CheckBox
android:id="@+id/cbMsgBoxM1"
android:layout_width="@dimen/dp_148"
android:layout_height="@dimen/dp_148"
android:background="@drawable/selector_msg_box_m"
android:button="@null"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
<!--乘客端消息提示-->
<View
android:id="@+id/msgBoxMTipView"
android:layout_width="8dp"
android:layout_height="8dp"
android:background="@drawable/version_upgrade_tips_background"
android:translationZ="30dp"
app:layout_constraintCircle="@id/cbMsgBoxM1"
app:layout_constraintCircleAngle="35"
app:layout_constraintCircleRadius="25dp"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,295 +1,298 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/sopLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/dp_800"
android:layout_height="@dimen/dp_1100"
android:background="#FFFFFF"
android:orientation="vertical">
android:background="#FFFFFF">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="UselessParent">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/verticalGuideLine"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--绕障类功能-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbObstacleAvoidance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绕障类功能"
android:paddingTop="40dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalGuideLine"
/>
<!--绕障类功能-->
<ToggleButton
android:id="@+id/tbObstacleAvoidance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="开启绕障类功能"
android:textOn="关闭绕障类功能"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toTopOf="parent"
/>
<!--危险障碍物颜色标记-->
<ToggleButton
android:id="@+id/tbMarkingObstacles"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="开启「危险障碍物颜色标记」"
android:textOn="关闭「危险障碍物颜色标记」"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toBottomOf="@id/tbObstacleAvoidance"
/>
<!--引导线动态效果-->
<ToggleButton
android:id="@+id/tbRouteDynamicEffect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="开启「引导线动态效果」"
android:textOn="关闭「引导线动态效果」"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toBottomOf="@id/tbMarkingObstacles"
/>
<!--红绿灯标识-->
<ToggleButton
android:id="@+id/tbTrafficLight"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="隐藏红绿灯标识"
android:textOn="展示红绿灯标识"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toBottomOf="@id/tbRouteDynamicEffect"
/>
<!--限速标识-->
<ToggleButton
android:id="@+id/tbSpeedLimit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="展示限速标识"
android:textOn="隐藏限速标识"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toBottomOf="@id/tbTrafficLight"
/>
<!--危险障碍物颜色标记-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbMarkingObstacles"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="危险障碍物颜色标记"
android:paddingTop="40dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/verticalGuideLine"
app:layout_constraintRight_toRightOf="parent"
/>
<ToggleButton
android:id="@+id/tbDemoMode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="开启美化模式"
android:textOn="关闭美化模式"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toBottomOf="@id/tbSpeedLimit"
/>
<!--引导线动态效果-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbRouteDynamicEffect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="引导线动态效果"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbObstacleAvoidance"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalGuideLine"
/>
<ToggleButton
android:id="@+id/tbRainMode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="开启雨天模式"
android:textOn="关闭雨天模式"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toBottomOf="@id/tbDemoMode"
/>
<!--红绿灯标识-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbTrafficLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="红绿灯标识"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbObstacleAvoidance"
app:layout_constraintLeft_toRightOf="@id/verticalGuideLine"
app:layout_constraintRight_toRightOf="parent"
/>
<ToggleButton
android:id="@+id/tbObu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="开启OBU"
android:textOn="关闭OBU"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toBottomOf="@id/tbRainMode"
/>
<!--限速标识-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbSpeedLimit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="限速标识"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbRouteDynamicEffect"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalGuideLine"
/>
<ToggleButton
android:id="@+id/tbObuV2vView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="展示v2v事件"
android:textOn="不展示v2v事件"
app:layout_constraintTop_toBottomOf="@id/tbObu"
android:textSize="@dimen/dp_24" />
<!--美化模式-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbDemoMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="美化模式"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbRouteDynamicEffect"
app:layout_constraintLeft_toRightOf="@id/verticalGuideLine"
app:layout_constraintRight_toRightOf="parent"
/>
<ToggleButton
android:id="@+id/tbObuV2iView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="展示v2i事件"
android:textOn="不展示v2i事件"
app:layout_constraintTop_toBottomOf="@id/tbObuV2vView"
android:textSize="@dimen/dp_24" />
<!--雨天模式-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbRainMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="雨天模式"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbSpeedLimit"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalGuideLine"
/>
<ToggleButton
android:id="@+id/tbObuToDcView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
app:layout_constraintTop_toBottomOf="@id/tbObuV2iView"
android:textOff="关闭OBU到工控机V2I显示"
android:textOn="打开OBU到工控机V2I显示"
android:textSize="@dimen/dp_24" />
<!--OBU-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbObu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OBU"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbSpeedLimit"
app:layout_constraintLeft_toRightOf="@id/verticalGuideLine"
app:layout_constraintRight_toRightOf="parent"
/>
<ToggleButton
android:id="@+id/tbObuWeaknessTrafficSop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
app:layout_constraintTop_toBottomOf="@id/tbObuToDcView"
android:textOff="关闭路侧弱势群体预警"
android:textOn="打开路侧弱势群体预警"
android:textSize="@dimen/dp_24" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbObuV2vView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="V2V事件"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbRainMode"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalGuideLine"
/>
<ToggleButton
android:id="@+id/tbCloudWeaknessTrafficSop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
app:layout_constraintTop_toBottomOf="@id/tbObuWeaknessTrafficSop"
android:textOff="开启云端弱势群体预警"
android:textOn="关闭云端弱势群体预警"
android:textSize="@dimen/dp_24" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbObuV2iView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="V2I事件"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbRainMode"
app:layout_constraintLeft_toRightOf="@id/verticalGuideLine"
app:layout_constraintRight_toRightOf="parent"
/>
<ToggleButton
android:id="@+id/tbIPCReport"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="开启异常上报提示"
android:textOn="关闭异常上报提示"
android:textSize="@dimen/dp_24"
app:layout_constraintTop_toBottomOf="@id/tbCloudWeaknessTrafficSop"
/>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbObuToDcView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OBU到工控机V2I显示"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbObuV2vView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalGuideLine"
/>
<ToggleButton
android:id="@+id/tbRoadLimitSpeedSop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/dp_20"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:textOff="获取路侧限速提醒"
android:textOn="关闭路侧限速提醒"
app:layout_constraintTop_toBottomOf="@id/tbIPCReport"
android:textSize="@dimen/dp_24" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbObuWeaknessTrafficSop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="路侧弱势群体预警"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbObuV2vView"
app:layout_constraintLeft_toRightOf="@id/verticalGuideLine"
app:layout_constraintRight_toRightOf="parent"
/>
<TextView
android:id="@+id/tvSpeedThresholdTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/tbRoadLimitSpeedSop"
android:text="变道速度阈值:"
android:textSize="@dimen/dp_36"
android:textColor="#1A1A1A"
android:layout_margin="10dp"
/>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbCloudWeaknessTrafficSop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="云端弱势群体预警"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbObuToDcView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalGuideLine"
/>
<ImageView
android:id="@+id/ivSpeedReduce"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
app:layout_constraintLeft_toRightOf="@id/tvSpeedThresholdTitle"
app:layout_constraintTop_toTopOf="@id/tvSpeedThresholdTitle"
app:layout_constraintBottom_toBottomOf="@id/tvSpeedThresholdTitle"
android:src="@drawable/icon_reduce"
android:padding="10dp"
/>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbIPCReport"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="异常上报提示"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbObuToDcView"
app:layout_constraintLeft_toRightOf="@id/verticalGuideLine"
app:layout_constraintRight_toRightOf="parent"
/>
<TextView
android:id="@+id/tvSpeed"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="@id/ivSpeedReduce"
app:layout_constraintBottom_toBottomOf="@id/ivSpeedReduce"
app:layout_constraintLeft_toRightOf="@id/ivSpeedReduce"
android:textSize="@dimen/dp_36"
android:gravity="center"
android:background="@drawable/debug_setting_edit_bg"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
/>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/tbRoadLimitSpeedSop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="路侧限速提醒"
android:paddingTop="25dp"
android:paddingBottom="25dp"
android:scaleY="1.2"
android:scaleX="1.2"
app:layout_constraintTop_toBottomOf="@id/tbCloudWeaknessTrafficSop"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalGuideLine"
/>
<ImageView
android:id="@+id/ivSpeedAdd"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
app:layout_constraintTop_toTopOf="@id/tvSpeed"
app:layout_constraintBottom_toBottomOf="@id/tvSpeed"
app:layout_constraintLeft_toRightOf="@id/tvSpeed"
android:src="@drawable/icon_add"
android:padding="10dp"
/>
<TextView
android:id="@+id/tvSpeedThresholdTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/tbRoadLimitSpeedSop"
android:text="变道速度阈值:"
android:textSize="@dimen/dp_36"
android:textColor="#1A1A1A"
android:layout_margin="20dp"
/>
<Button
android:id="@+id/btnSpeedSet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/dp_20"
app:layout_constraintTop_toTopOf="@id/ivSpeedAdd"
app:layout_constraintBottom_toBottomOf="@id/ivSpeedAdd"
app:layout_constraintLeft_toRightOf="@id/ivSpeedAdd"
android:text="设置阈值"
android:layout_marginStart="10dp"
/>
<ImageView
android:id="@+id/ivSpeedReduce"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
app:layout_constraintLeft_toRightOf="@id/tvSpeedThresholdTitle"
app:layout_constraintTop_toTopOf="@id/tvSpeedThresholdTitle"
app:layout_constraintBottom_toBottomOf="@id/tvSpeedThresholdTitle"
android:src="@drawable/icon_reduce"
android:padding="10dp"
/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_margin="10dp"
android:background="#F0F0F0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnSpeedSet"
/>
<TextView
android:id="@+id/tvSpeed"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="@id/ivSpeedReduce"
app:layout_constraintBottom_toBottomOf="@id/ivSpeedReduce"
app:layout_constraintLeft_toRightOf="@id/ivSpeedReduce"
android:textSize="@dimen/dp_36"
android:gravity="center"
android:background="@drawable/debug_setting_edit_bg"
android:paddingStart="15dp"
android:paddingEnd="15dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
/>
<ImageView
android:id="@+id/ivSpeedAdd"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
app:layout_constraintTop_toTopOf="@id/tvSpeed"
app:layout_constraintBottom_toBottomOf="@id/tvSpeed"
app:layout_constraintLeft_toRightOf="@id/tvSpeed"
android:src="@drawable/icon_add"
android:padding="10dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<Button
android:id="@+id/btnSpeedSet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/dp_20"
app:layout_constraintTop_toTopOf="@id/ivSpeedAdd"
app:layout_constraintBottom_toBottomOf="@id/ivSpeedAdd"
app:layout_constraintLeft_toRightOf="@id/ivSpeedAdd"
android:text="设置阈值"
android:layout_marginStart="10dp"
/>
</ScrollView>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -82,7 +82,6 @@
android:visibility="gone"
/>
<ImageView
android:id="@+id/ivAdStatus"
android:layout_width="120dp"
@@ -120,4 +119,27 @@
android:textSize="32dp"
/>
<ImageView
android:id="@+id/ivHDCache"
android:layout_width="150dp"
android:layout_height="150dp"
app:layout_constraintTop_toTopOf="@id/ivAdVersion"
app:layout_constraintBottom_toBottomOf="@id/ivAdVersion"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="680dp"
android:src="@drawable/icon_hd_map"
android:padding="12dp"
android:background="@drawable/version_latest_background"
/>
<ImageView
android:id="@+id/ivHDCacheStatus"
android:layout_width="120dp"
android:layout_height="50dp"
android:src="@drawable/icon_be_updated"
app:layout_constraintCircle="@id/ivHDCache"
app:layout_constraintCircleAngle="50"
app:layout_constraintCircleRadius="90dp"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -71,7 +71,5 @@
<color name="hmi_check_keyboard_input_field">#FF282F62</color>
<color name="bus_autopilot_text_color_normal">#FFFFFF</color>
<color name="dialog_bg_color_90_percent">#E63B4577</color>
</resources>

View File

@@ -65,4 +65,12 @@
<string name="dispatch_cars_remind_content">车辆将开启自动驾驶,并行驶至:</string>
<string name="dispatch_cars_affirm">确认</string>
<string name="dispatch_cars_cancel">取消</string>
<string name="offline_map_cache_tip">离线地图缓存提醒</string>
<string name="cache_offline_map_content">是否缓存最新版本离线地图?</string>
<string name="offline_downloading">离线地图下载中</string>
<string name="offline_download_success">离线地图下载成功</string>
<string name="offline_download_failure">离线地图下载失败</string>
<string name="offline_had_downloaded">当前已为最新版本</string>
<string name="ok_tip">确定</string>
<string name="retry">重试</string>
</resources>