18034727885
2026-06-23 56fedc881e978953c3b0636b93c6e25852efa190
修复问题
7个文件已添加
27个文件已修改
1304 ■■■■■ 已修改文件
app/src/main/AndroidManifest.xml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/model/AppVersionModel.kt 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/model/CarModel.kt 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/push/MessageHandler.kt 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/MainActivity.kt 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/task/accident/handle/AccidentProcessVM.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/task/list/TaskListAdapter.kt 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/user/mine/set/SetActivity.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/CarAdapter.kt 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/car/detail/dispatch/DispatchFragment.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/car/detail/operations/check/CheckCarActivity.kt 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/car/detail/operations/check/CheckCarVM.kt 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/car/manage/CarAdapter.kt 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/car/manage/CarManageActivity.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/shape_blue_1_bg_2.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_accident_process.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_car_check.xml 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_car_manage.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_site_nav.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/dialog_car_filter.xml 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_car_operations.xml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_mine.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/icon_car_charge.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/icon_car_exception.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/icon_car_order.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/icon_car_running.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/icon_car_stop_order.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/icon_car_working.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/img_work_report.png 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/res/drawable/svg_car_chongdian.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/res/drawable/svg_car_jiance.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/res/drawable/svg_car_qingjie.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/res/drawable/svg_car_weixiu.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/res/drawable/svg_car_zhengbei.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -204,6 +204,7 @@
            android:screenOrientation="portrait"
            android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"
            android:name=".ui.work.site.SiteNavActivity"
            android:windowSoftInputMode="adjustResize"
            android:launchMode="singleTop" />
        <activity
            android:screenOrientation="portrait"
app/src/main/java/com/xw/yunwei/model/AppVersionModel.kt
@@ -1,6 +1,7 @@
package com.xw.yunwei.model
import com.google.gson.annotations.SerializedName
import org.json.JSONObject
/**
 * 应用版本更新信息数据类
@@ -43,4 +44,14 @@
    @SerializedName("forceUpdateFlag")
    val forceUpdateFlag: Int? = null,
    )
    ) {
    //获取下载路径
    fun getDownloadUrl(): String? {
        return try {
            JSONObject(androidFile ?: "").optString("url")
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }
}
app/src/main/java/com/xw/yunwei/model/CarModel.kt
@@ -3,6 +3,7 @@
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import com.xw.common.utils.BindUtils.getUrl
import com.xw.yunwei.R
import kotlinx.parcelize.Parcelize
/**
@@ -250,7 +251,12 @@
    /**
     * 是否已经打开后备箱 1是 前端字段
     */
    val hadTrunkOpened: String? = null
    val hadTrunkOpened: String? = null,
    /**
     * 车辆状态(1=运营中,2=出车中,3=接单中,4=停止接单,5=已收车,6=车辆异常,7=维修中,8=充电中)
     */
    val vehicleStatus: String? = null
) : Parcelable {
    //获取车辆图片
    fun getShowVehiclePicture(): String {
@@ -270,6 +276,7 @@
    fun hadOpenedTrunk(): Boolean {
        return hadTrunkOpened == "1"
    }
    //是否正在工作中
    fun isWorking(): Boolean {
        return operatingStatus == 1
@@ -284,4 +291,54 @@
    fun isArrivingPoint(): Boolean {
        return !pointName.isNullOrEmpty()
    }
    //获取显示状态 1=运营中,2=出车中,3=接单中,4=停止接单,5=已收车,6=车辆异常,7=维修中,8=充电中
    fun getShowStatus(): String {
        return when (vehicleStatus) {
            "1" -> "运营中"
            "2" -> "出车中"
            "3" -> "接单中"
            "4" -> "停止接单"
            "5" -> "已收车"
            "6" -> "车辆异常"
            "7" -> "维修中"
            "8" -> "充电中"
            else -> ""
        }
    }
    //获取显示状态文字颜色 1=运营中,2=出车中,3=接单中,4=停止接单,5=已收车,6=车辆异常,7=维修中,8=充电中
    fun getShowStatusTextColor(): Int {
        return when (vehicleStatus) {
            "1", "2", "3" -> com.xw.common.R.color.blue_5
            "4", "5" -> com.xw.common.R.color.gray_8
            "6", "7", "8" -> com.xw.common.R.color.orange_5
            else -> com.xw.common.R.color.black
        }
    }
    //获取显示状态背景资源 1=运营中,2=出车中,3=接单中,4=停止接单,5=已收车,6=车辆异常,7=维修中,8=充电中
    fun getShowStatusBgResource(): Int {
        return when (vehicleStatus) {
            "1", "2", "3" -> R.drawable.shape_blue_1_bg_2
            "4", "5" -> R.drawable.shape_gray_3_bg_2
            "6", "7", "8" -> R.drawable.shape_orange_1_bg_2
            else -> 0
        }
    }
    //获取显示状态图片资源 1=运营中,2=出车中,3=接单中,4=停止接单,5=已收车,6=车辆异常,7=维修中,8=充电中
    fun getShowStatusImageResource(): Int {
        return when (vehicleStatus) {
            "1" -> R.mipmap.icon_car_running
            "2" -> R.mipmap.icon_car_working
            "3" -> R.mipmap.icon_car_order
            "4" -> R.mipmap.icon_car_stop_order
            "5" -> R.mipmap.ic_work_quche
            "6" -> R.mipmap.icon_car_exception
            "7" -> R.mipmap.ic_work_weixiu
            "8" -> R.mipmap.icon_car_charge
            else -> 0
        }
    }
}
app/src/main/java/com/xw/yunwei/push/MessageHandler.kt
@@ -3,17 +3,15 @@
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.os.Handler
import android.os.Looper
import android.webkit.WebSettings
import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.lifecycleScope
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.customview.getCustomView
import com.blankj.utilcode.util.AppUtils
import com.google.android.material.tabs.TabLayout
import com.xw.common.net.UpdateManager
import com.xw.common.net.interceptor.ApiException
import com.xw.common.utils.KeyPreferences
import com.xw.common.utils.LogUtils
import com.xw.common.utils.MMKVManager
@@ -22,6 +20,7 @@
import com.xw.yunwei.databinding.DialogProtocolBinding
import com.xw.yunwei.extension.safeLoadDataWithBaseURL
import com.xw.yunwei.extension.setSafeSetting
import com.xw.yunwei.model.AgreeInfo
import com.xw.yunwei.model.SwitchTabMain
import com.xw.yunwei.model.SwitchTabTask
import com.xw.yunwei.net.UserRepository
@@ -32,15 +31,25 @@
import com.xw.yunwei.ui.user.mine.protocol.ProtocolActivity
import com.xw.yunwei.ui.user.mine.scheduling.SchedulingActivity
import com.xw.yunwei.utils.DialogFactory
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
import org.json.JSONObject
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import java.io.IOException
import java.net.ConnectException
import java.net.SocketException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
object MessageHandler : KoinComponent {
    var TAG = "zmc-${this.javaClass.simpleName}"
    val userRepository: UserRepository by inject()
    fun handlePushEvent(content: String?, isPush: Boolean = false) {
@@ -75,8 +84,7 @@
        GlobalScope.launch {
            val currentShowActivity = MyApp.myApp.getCurrentShowActivity()
            LogUtils.i(
                "zmc-MessageHandler",
                "handlePushEvent ${currentShowActivity.javaClass.name}"
                "zmc-MessageHandler", "handlePushEvent ${currentShowActivity.javaClass.name}"
            )
            handleMsg(currentShowActivity, strategy, id, isPush)
        }
@@ -94,8 +102,7 @@
                currentShowActivity.startActivity(
                    Intent(currentShowActivity, AccidentDetailActivity::class.java).apply {
                        putExtra("taskId", id.toLong())
                    }
                )
                    })
            }
            4 -> { // 排班信息变动
@@ -119,8 +126,7 @@
                    currentShowActivity.startActivity(
                        Intent(currentShowActivity, NormalTaskDetailActivity::class.java).apply {
                            putExtra("taskId", id.toLong())
                        }
                    )
                        })
                }
            }
@@ -154,12 +160,12 @@
    }
    fun showUpdateDialog(currentShowActivity: Activity) {
        (currentShowActivity as AppCompatActivity).lifecycleScope.launch {
        launchRequest {
            userRepository.getVersion()?.let {
                Handler(Looper.getMainLooper()).post {
                runOnMainThread {
                    UpdateManager.instance!!
                        .setContext(currentShowActivity)
                        .apkUrl(it.androidFile ?: "")
                        .apkUrl(it.getDownloadUrl() ?: "")
                        .updateContent(it.updateDescription ?: "")
                        .updateVersionCode(it.versionCode ?: 1)
                        .updateVersionName(it.version ?: "1.0")
@@ -175,76 +181,71 @@
        forced: Boolean,
        dismissBlock: (() -> Unit)? = null
    ) {
        Handler(Looper.getMainLooper()).post {
            DialogFactory.produce(currentShowActivity).cornerRadius(15f).cancelable(!forced).show {
                customView(
                    com.xw.yunwei.R.layout.dialog_protocol,
                    noVerticalPadding = true,
                    dialogWrapContent = true
                )
                DataBindingUtil.bind<DialogProtocolBinding>(getCustomView())?.let { bind ->
//                    val tab1 = bind.protocolLayout.tabLayout.newTab().apply { text = "用户协议" }
//                    val tab2 = bind.protocolLayout.tabLayout.newTab().apply { text = "隐私条款" }
                    val tab1 = bind.protocolLayout.tabLayout.newTab()
                        .apply { text = "小鹏Robotaxi...隐私政策" }
                    val tab2 =
                        bind.protocolLayout.tabLayout.newTab().apply { text = "第三方共享信息清单" }
                    val tab3 =
                        bind.protocolLayout.tabLayout.newTab().apply { text = "个人信息收集清单" }
                    val tab4 = bind.protocolLayout.tabLayout.newTab().apply { text = "权限调用" }
                    bind.protocolLayout.tabLayout.addTab(tab1, true)
                    bind.protocolLayout.tabLayout.addTab(tab2, false)
                    bind.protocolLayout.tabLayout.addTab(tab3, false)
                    bind.protocolLayout.tabLayout.addTab(tab4, false)
                    // bind.btnLeft.text = if (forced) "取消并退出" else "关闭"
                    bind.btnLeft.text = "关闭"
                    bind.btnLeft.setOnClickListener {
                        dismiss()
                        if (forced) {
                            currentShowActivity.finishAffinity()
                            android.os.Process.killProcess(android.os.Process.myPid())
                        }
                    }
                    bind.btnRight.setOnClickListener {
                        MMKVManager.getInstance().saveBoolean(KeyPreferences.NEED_READ, false)
                        dismiss()
                    }
                    initWeb(bind.protocolLayout.web)
                    val getProtocol: (Int) -> Unit = { type ->
                        (currentShowActivity as AppCompatActivity).lifecycleScope.launch {
                            val data = userRepository.getProtocol(type)
                            Handler(Looper.getMainLooper()).post {
                                setContent(bind.protocolLayout.web, data?.content ?: "")
                            }
                        }
                    }
                    getProtocol(8)
                    bind.protocolLayout.tabLayout.addOnTabSelectedListener(object :
                        TabLayout.OnTabSelectedListener {
                        override fun onTabSelected(tab: TabLayout.Tab?) {
                            tab?.let {
                                when (it.text) {
                                    "用户协议" -> getProtocol(1)
                                    "隐私条款" -> getProtocol(2)
                                    "小鹏Robotaxi...隐私政策" -> getProtocol(8)
                                    "第三方共享信息清单" -> getProtocol(9)
                                    "个人信息收集清单" -> getProtocol(10)
                                    "权限调用" -> getProtocol(11)
                                    else -> {}
                                }
                            }
                        }
                        override fun onTabUnselected(tab: TabLayout.Tab?) {}
                        override fun onTabReselected(tab: TabLayout.Tab?) {}
                    })
        launchRequest {
            userRepository.getAgreeConfig()?.also { list ->
                runOnMainThread {
                    showProtocolDialog(currentShowActivity, forced, list, dismissBlock)
                }
                setOnDismissListener { dismissBlock?.invoke() }
            }
        }
    }
    //显示隐私弹窗
    private fun showProtocolDialog(
        currentShowActivity: Activity,
        forced: Boolean,
        list: List<AgreeInfo>,
        dismissBlock: (() -> Unit)? = null
    ) {
        DialogFactory.produce(currentShowActivity).cornerRadius(15f).cancelable(!forced).show {
            customView(
                com.xw.yunwei.R.layout.dialog_protocol,
                noVerticalPadding = true,
                dialogWrapContent = true
            )
            DataBindingUtil.bind<DialogProtocolBinding>(getCustomView())?.let { bind ->
                list.forEachIndexed { index, info ->
                    val tab = bind.protocolLayout.tabLayout.newTab().apply { text = info.name }
                    bind.protocolLayout.tabLayout.addTab(tab, index == 0)
                }
                // bind.btnLeft.text = if (forced) "取消并退出" else "关闭"
                bind.btnLeft.text = "关闭"
                bind.btnLeft.setOnClickListener {
                    dismiss()
                    if (forced) {
                        currentShowActivity.finishAffinity()
                        android.os.Process.killProcess(android.os.Process.myPid())
                    }
                }
                bind.btnRight.setOnClickListener {
                    MMKVManager.getInstance().saveBoolean(KeyPreferences.NEED_READ, false)
                    dismiss()
                }
                initWeb(bind.protocolLayout.web)
                bind.protocolLayout.tabLayout.addOnTabSelectedListener(object :
                    TabLayout.OnTabSelectedListener {
                    override fun onTabSelected(tab: TabLayout.Tab?) {
                        tab?.let {
                            loadProtocolWeb(bind.protocolLayout.web, list, it.position)
                        }
                    }
                    override fun onTabUnselected(tab: TabLayout.Tab?) {}
                    override fun onTabReselected(tab: TabLayout.Tab?) {}
                })
            }
            setOnDismissListener { dismissBlock?.invoke() }
        }
    }
    //加载协议网页
    private fun loadProtocolWeb(webView: WebView, list: List<AgreeInfo>, position: Int) {
        list.getOrNull(position)?.takeIf { (it.id?.toIntOrNull() ?: 0) > 0 }?.also { it ->
            launchRequest {
                userRepository.getLoginProtocol(it.id!!.toInt())?.let {
                    runOnMainThread { setContent(webView, it.content ?: "") }
                }
            }
        }
    }
@@ -287,4 +288,75 @@
        }
    }
    private val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
        LogUtils.e(TAG, "Uncaught coroutine exception: ${throwable.message}")
        runOnMainThread {
            ToastUtilCommon.showError(getNetworkErrorMessage(throwable))
        }
    }
    private suspend fun errorHandling(
        e: Throwable,
        error: suspend (code: Int, msg: String) -> Unit
    ) {
        if (e is ApiException) {
            when {
                e.isTokenExpired() -> {
                    MMKVManager.getInstance().clear()
                    ToastUtilCommon.showWarn("登录已过期,请重新登录")
                    CoroutineScope(Dispatchers.IO + exceptionHandler).launch {
                        delay(1000)
                        AppUtils.relaunchApp(true)
                    }
                }
                else -> {
                    error.invoke(e.code, e.message ?: "")
                }
            }
        } else {
            val errorMsg = getNetworkErrorMessage(e)
            error.invoke(-1, errorMsg)
        }
    }
    /**
     * 获取网络异常的友好提示信息
     */
    private fun getNetworkErrorMessage(e: Throwable): String {
        return when (e) {
            is UnknownHostException -> "网络连接失败,请检查网络设置"
            is ConnectException -> "无法连接到服务器,请检查网络"
            is SocketTimeoutException -> "连接超时,请稍后重试"
            is SocketException -> "网络异常,请检查网络连接"
            is IOException -> "网络请求失败,请检查网络"
            else -> e.message ?: "未知错误"
        }
    }
    //运行在主线程
    private fun runOnMainThread(block: () -> Unit) {
        CoroutineScope(Dispatchers.Main + exceptionHandler).launch {
            block()
        }
    }
    private fun launchRequest(
        error: suspend (code: Int, msg: String) -> Unit = { code, msg ->
            ToastUtilCommon.showError(msg)
            LogUtils.e(TAG, "launchRequest: code = $code msg = $msg")
        }, request: suspend () -> Unit
    ) {
        CoroutineScope(Dispatchers.IO + exceptionHandler).launch {
            try {
                request()
            } catch (e: Throwable) {
                try {
                    errorHandling(e, error)
                } catch (handlingError: Throwable) {
                    LogUtils.e(TAG, "Error handling failed: ${handlingError.message}")
                }
            }
        }
    }
}
app/src/main/java/com/xw/yunwei/ui/MainActivity.kt
@@ -2,9 +2,11 @@
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.lifecycleScope
import com.amap.api.location.AMapLocation
import com.blankj.utilcode.util.AppUtils
@@ -42,6 +44,27 @@
        MineFragment::class.java.name
    )
    lateinit var gpsHelper: GpsHelper
    /**
     * 进程被杀重建时(如后台禁用运行时权限触发进程死亡),
     * ViewModel 会被重建、selectIndex 丢失并回退到默认 0。
     * 此处在 ViewModel 创建之后、setObservable 注册观察者之前,
     * 先把上次保存的 index 恢复回去,避免重建后底部导航错乱。
     */
    override fun myCreate(savedInstanceState: Bundle?) {
        super.myCreate(savedInstanceState)
        savedInstanceState?.let {
            if (it.containsKey(KEY_SELECT_INDEX)) {
                viewModel.selectIndex.value = it.getInt(KEY_SELECT_INDEX)
            }
        }
    }
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        viewModel.selectIndex.value?.let { outState.putInt(KEY_SELECT_INDEX, it) }
    }
    override fun init() {
        super.init()
        val user = MMKVManager.getInstance().getModel<UserInfo>(KeyPreferences.USER)
@@ -76,15 +99,7 @@
        super.setObservable()
        viewModel.selectIndex.observe(this) {
            showFragment(it)
            if (viewModel.taskPermissions.value == true) {
                binding.navView.visibility = if (viewModel.workPermissions.value == true) {
                    if (it == 1) View.GONE else View.VISIBLE
                } else {
                    if (it == 0) View.GONE else View.VISIBLE
                }
            } else {
                binding.navView.visibility = View.VISIBLE
            }
            updateNavViewVisibility(it)
        }
        MyApp.permissions.observe(this) {
            viewModel.workPermissions.value = MyApp.findPermissionByName("工作台")?.visible == "0"
@@ -107,7 +122,27 @@
                    currentIndex = 2
                }
                viewModel.changeSelectFragmentIndex(currentIndex)
                // 权限可能在 index 不变的情况下变化,需主动重算底部主导航可见性,
                // 否则 selectIndex 不发射时 navView 可见性无法被纠正(双 Tab bar 叠加根因之一)
                updateNavViewVisibility(currentIndex)
            }
        }
    }
    /**
     * 重新计算 Activity 底部主导航(工作台/任务中心/我的)的可见性。
     * 进入任务中心(index==1)时隐藏主导航,仅展示 TaskFragment 自带的底部栏。
     * 抽成独立方法,使其在 index 变化与权限变化时都能被触发。
     */
    private fun updateNavViewVisibility(index: Int) {
        binding.navView.visibility = if (viewModel.taskPermissions.value == true) {
            if (viewModel.workPermissions.value == true) {
                if (index == 1) View.GONE else View.VISIBLE
            } else {
                if (index == 0) View.GONE else View.VISIBLE
            }
        } else {
            View.VISIBLE
        }
    }
@@ -125,7 +160,7 @@
            if (it.forceUpdateFlag == 1) {
                UpdateManager.instance!!
                    .setContext(this@MainActivity)
                    .apkUrl(it.androidFile ?: "")
                    .apkUrl(it.getDownloadUrl() ?: "")
                    .updateContent(it.updateDescription ?: "")
                    .updateVersionCode(it.versionCode ?: 1)
                    .updateVersionName(it.version ?: "1.0")
@@ -184,6 +219,10 @@
    private fun showFragment(from: Fragment?, to: Fragment, tag: String) {
        val transaction = supportFragmentManager.beginTransaction()
        if (from == null) {
            // 进程重建后 mCurrentFragment 丢失,FragmentManager 会自动恢复之前 add 过的
            // Fragment 并保留其显隐状态。此处主动隐藏除目标外的其他 Fragment,
            // 避免任务中心与工作台等 Fragment 叠加导致出现两套底部 Tab bar。
            hideOtherFragments(transaction, tag)
            if (to.isAdded) {
                transaction.show(to)
            } else {
@@ -198,6 +237,17 @@
        }
        transaction.commit()
        mCurrentFragment = to
    }
    /**
     * 隐藏除 currentTag 之外、已被 FragmentManager 恢复/添加的导航 Fragment,
     * 保证同一时刻只有一个 Fragment 可见。
     */
    private fun hideOtherFragments(transaction: FragmentTransaction, currentTag: String) {
        for (name in fragmentNames) {
            if (name == currentTag) continue
            supportFragmentManager.findFragmentByTag(name)?.let { transaction.hide(it) }
        }
    }
    override fun onResume() {
@@ -227,4 +277,8 @@
    override fun location(pLocation: AMapLocation?) {
    }
    companion object {
        private const val KEY_SELECT_INDEX = "key_select_index"
    }
}
app/src/main/java/com/xw/yunwei/ui/task/accident/handle/AccidentProcessVM.kt
@@ -150,7 +150,7 @@
                map["disposalImage"] = "${adapters[2].data.map { it.url }}"
                map["taskTypeId"] = getSelectType()
                taskRepository.handleVehicleAccident(map)
                ToastUtilCommon.showSuc("提交成功")
                ToastUtilCommon.showSuc("提交成功,事故已归档")
                startActivity(MainActivity::class.java)
            }
app/src/main/java/com/xw/yunwei/ui/task/list/TaskListAdapter.kt
@@ -297,8 +297,8 @@
        bind.minutes.text = if (list[1] < 10) "0${list[1]}" else "${list[1]}"
        bind.second.text = if (list[2] < 10) "0${list[2]}" else "${list[2]}"
        // 当剩余时间不足1分钟时,切换为红色警示样式
        val showRed = list[0] == 0L && list[1] == 0L
        // 当剩余时间不足3分钟时,切换为红色警示样式
        val showRed = list[0] == 0L && list[1] <= 3L
        val countdownId =
            if (showRed) R.mipmap.img_task_item_top_bg_red else R.mipmap.img_task_item_top_bg_blue
app/src/main/java/com/xw/yunwei/ui/user/mine/set/SetActivity.kt
@@ -90,7 +90,7 @@
                if (versionCode < (it.forceUpdateFlag ?: 0)) {
                    UpdateManager.instance!!
                        .setContext(this@SetActivity)
                        .apkUrl(it.androidFile ?: "")
                        .apkUrl(it.getDownloadUrl() ?: "")
                        .updateContent(it.updateDescription ?: "")
                        .updateVersionCode(it.versionCode ?: 1)
                        .updateVersionName(it.version ?: "1.0")
app/src/main/java/com/xw/yunwei/ui/work/CarAdapter.kt
@@ -31,18 +31,7 @@
                )
            )
            binding.batteryView.setLevel(item.currentElectricity ?: 0)
            val setStatus: (Int) -> Unit = { id ->
                binding.status.setImageResource(id)
            }
            // 1=运营中 2=维修中 3=已收车 4=车辆异常
            when (item.operatingStatus) {
                1 -> setStatus(R.mipmap.ic_work_fache)
                2 -> setStatus(R.mipmap.ic_work_weixiu)
                3 -> setStatus(R.mipmap.ic_work_quche)
                4 -> setStatus(R.mipmap.ic_work_weixiu)
            }
            binding.status.setImageResource(item.getShowStatusImageResource())
        }
    }
app/src/main/java/com/xw/yunwei/ui/work/car/detail/dispatch/DispatchFragment.kt
@@ -116,13 +116,13 @@
                                    binding.slideView1.animateReset()
                                },
                                confirmBlock = { point, dialog ->
                                    dialog.dismiss()
                                    viewModel.vehicleDispatchDeparture(
                                        setStatus = setStatus,
                                        xpPointId = point.id,
                                        error = {
                                            SelectConfirmAcceptCarPointDialog.hadOperation = false
                                        }) {
                                        dialog.dismiss()
                                        if (getSlideDirection() == DIRECTION_RIGHT) {
                                            resetSlideView(this, DIRECTION_LEFT, "左滑收车")
                                        } else if (getSlideDirection() == DIRECTION_LEFT) {
app/src/main/java/com/xw/yunwei/ui/work/car/detail/operations/check/CheckCarActivity.kt
@@ -2,6 +2,8 @@
import android.annotation.SuppressLint
import android.net.Uri
import android.widget.TextView
import androidx.lifecycle.MutableLiveData
import androidx.recyclerview.widget.GridLayoutManager
import com.blankj.utilcode.util.UriUtils
import com.luck.picture.lib.config.PictureMimeType
@@ -12,8 +14,6 @@
import com.xw.common.base.ImageEventListener
import com.xw.common.base.ImageSelectAdapter
import com.xw.common.base.ShowImgListDialog
import com.xw.common.custom.SlideSwitchView.OnStateChangeListener
import com.xw.common.utils.ToastUtilCommon
import com.xw.common.viewAdapter.ImageDefault
import com.xw.common.viewAdapter.ViewAdapter
import com.xw.yunwei.BR
@@ -21,9 +21,11 @@
import com.xw.yunwei.Constants.user
import com.xw.yunwei.R
import com.xw.yunwei.databinding.ActivityCarCheckBinding
import com.xw.yunwei.extension.colorIdToColorValue
import com.xw.yunwei.model.CarModel
import com.xw.yunwei.model.CheckRecordModel
import com.xw.yunwei.utils.PictureSelectorFactory
import androidx.core.net.toUri
/**
 * 车辆检测
@@ -48,74 +50,6 @@
        )
        viewModel.queryInfo()
        initAdapter()
        viewModel.switchs.clear()
        viewModel.switchs.addAll(
            listOf(
                binding.switch1,
                binding.switch2,
                binding.switch3,
                binding.switch4,
                binding.switch5
            )
        )
    }
    override fun setListener() {
        super.setListener()
        /**
         * 未检测状态必须是没有照片的情况下修改,传了照片不能修改为未检测:提示先删除照片;
         * 未传照片可以改为已检测,照片非必传
         */
        binding.switch1.setOnStateChangeListener(object : OnStateChangeListener {
            override fun onStateChanged(isChecked: Boolean) {
                if (viewModel.adapters[0].data.isNotEmpty() && !isChecked) {
                    binding.switch1.setChecked(checked = true, animate = true)
                    ToastUtilCommon.showWarn("请先删除照片")
                } else {
                    viewModel.requestModel.sensorCleaning = if (isChecked) 1 else 0
                }
            }
        })
        binding.switch2.setOnStateChangeListener(object : OnStateChangeListener {
            override fun onStateChanged(isChecked: Boolean) {
                if (viewModel.adapters[1].data.isNotEmpty() && !isChecked) {
                    binding.switch2.setChecked(checked = true, animate = true)
                    ToastUtilCommon.showWarn("请先删除照片")
                } else {
                    viewModel.requestModel.interactiveScreen = if (isChecked) 1 else 0
                }
            }
        })
        binding.switch3.setOnStateChangeListener(object : OnStateChangeListener {
            override fun onStateChanged(isChecked: Boolean) {
                if (viewModel.adapters[2].data.isNotEmpty() && !isChecked) {
                    binding.switch3.setChecked(checked = true, animate = true)
                    ToastUtilCommon.showWarn("请先删除照片")
                } else {
                    viewModel.requestModel.helpButton = if (isChecked) 1 else 0
                }
            }
        })
        binding.switch4.setOnStateChangeListener(object : OnStateChangeListener {
            override fun onStateChanged(isChecked: Boolean) {
                if (viewModel.adapters[3].data.isNotEmpty() && !isChecked) {
                    binding.switch4.setChecked(checked = true, animate = true)
                    ToastUtilCommon.showWarn("请先删除照片")
                } else {
                    viewModel.requestModel.paymentFunction = if (isChecked) 1 else 0
                }
            }
        })
        binding.switch5.setOnStateChangeListener(object : OnStateChangeListener {
            override fun onStateChanged(isChecked: Boolean) {
                if (viewModel.adapters[4].data.isNotEmpty() && !isChecked) {
                    binding.switch5.setChecked(checked = true, animate = true)
                    ToastUtilCommon.showWarn("请先删除照片")
                } else {
                    viewModel.requestModel.systemCheck = if (isChecked) 1 else 0
                }
            }
        })
    }
    override fun setObservable() {
@@ -140,6 +74,49 @@
            } else {
                adapter.setList(it) // 后续更新
            }
        }
        viewModel.checkStatus1.observe(this) {
            refreshStatus(binding.tvStatus1, it)
        }
        viewModel.checkStatus2.observe(this) {
            refreshStatus(binding.tvStatus2, it)
        }
        viewModel.checkStatus3.observe(this) {
            refreshStatus(binding.tvStatus3, it)
        }
        viewModel.checkStatus4.observe(this) {
            refreshStatus(binding.tvStatus4, it)
        }
        viewModel.checkStatus5.observe(this) {
            refreshStatus(binding.tvStatus5, it)
        }
    }
    //刷新状态
    private fun refreshStatus(textView: TextView, hadChecked: Boolean) {
        textView.setBackgroundResource(if (hadChecked) R.drawable.shape_green_1_bg_2 else R.drawable.shape_gray_3_bg_2)
        textView.setTextColor(
            (if (hadChecked) com.xw.common.R.color.green_5 else com.xw.common.R.color.gray_8).colorIdToColorValue(
                this
            )
        )
        textView.text = if (hadChecked) "检测完成" else "待检测"
    }
    //获取状态
    private fun getStatusLiveData(position: Int): MutableLiveData<Boolean> {
        return when (position) {
            0 -> viewModel.checkStatus1
            1 -> viewModel.checkStatus2
            2 -> viewModel.checkStatus3
            3 -> viewModel.checkStatus4
            4 -> viewModel.checkStatus5
            else -> MutableLiveData(false)
        }
    }
@@ -171,11 +148,8 @@
                override fun deleteImage(item: FileSelectBean) {
                    viewModel.adapters[index].remove(item)
                    if (viewModel.adapters[index].data.isEmpty() && viewModel.switchs[index].isChecked()) {
                        viewModel.switchs[index].setChecked(
                            checked = false,
                            animate = true
                        )
                    if (viewModel.adapters[index].data.isEmpty() && getStatusLiveData(index).value == true) {
                        getStatusLiveData(index).value = false
                    }
                }
            }
@@ -247,18 +221,15 @@
                    val path: String = item.availablePath
                    var imgPath =
                        if (PictureMimeType.isContent(path) && !item.isCut && !item.isCompressed) {
                            UriUtils.uri2File(Uri.parse(path)).absolutePath
                            UriUtils.uri2File(path.toUri()).absolutePath
                        } else {
                            path
                        }
                    dataList.add(FileSelectBean(localPath = imgPath, type = "img"))
                }
                viewModel.adapters[viewModel.operateIndex].setList(dataList)
                if (dataList.isNotEmpty() && !viewModel.switchs[viewModel.operateIndex].isChecked()) {
                    viewModel.switchs[viewModel.operateIndex].setChecked(
                        checked = true,
                        animate = true
                    )
                if (dataList.isNotEmpty() && getStatusLiveData(viewModel.operateIndex).value != true) {
                    getStatusLiveData(viewModel.operateIndex).value = true
                }
            }
        }
app/src/main/java/com/xw/yunwei/ui/work/car/detail/operations/check/CheckCarVM.kt
@@ -10,7 +10,6 @@
import com.xw.common.base.FileSelectBean
import com.xw.common.base.ImageEventListener
import com.xw.common.base.ImageSelectAdapter
import com.xw.common.custom.SlideSwitchView
import com.xw.common.utils.ToastUtilCommon
import com.xw.yunwei.R
import com.xw.yunwei.model.CarCheckModel
@@ -54,9 +53,21 @@
        }
    }
    val switchs = mutableListOf<SlideSwitchView>()
    val adaptersName =
        listOf("传感器清洁", "车内交互屏检查", "紧急求助按钮/应答机", "支付功能", "订单系统检查")
    //传感器清洁 检测状态
    val checkStatus1 = MutableLiveData(false)
    //车内交互屏检查 检测状态
    val checkStatus2 = MutableLiveData(false)
    //紧急求助按钮/应答机 检测状态
    val checkStatus3 = MutableLiveData(false)
    //支付功能 检测状态
    val checkStatus4 = MutableLiveData(false)
    //订单系统检查 检测状态
    val checkStatus5 = MutableLiveData(false)
    val adapters = mutableListOf<ImageSelectAdapter>()
    val imageEvents = mutableListOf<ImageEventListener<FileSelectBean>>()
    val maxSizes = listOf(6, 6, 6, 6, 6) // 先默认每个都是最大9张
@@ -140,7 +151,13 @@
//            return
//        }
        adapters.forEachIndexed { index, adapter ->
            if ((adapter.data.isEmpty() || !switchs[index].isChecked()) && index != 3) {
            if ((adapter.data.isEmpty() && index != 3) ||
                checkStatus1.value != true ||
                checkStatus2.value != true ||
                checkStatus3.value != true ||
//                        checkStatus4.value != true ||
                checkStatus5.value != true
            ) {
//                ToastUtilCommon.showError("请上传${adaptersName[index]}照片或修改检测状态")
                ToastUtilCommon.showError("请完成所有检测项并上传图片")
                return
app/src/main/java/com/xw/yunwei/ui/work/car/manage/CarAdapter.kt
@@ -10,6 +10,7 @@
import com.xw.common.viewAdapter.ViewAdapter
import com.xw.yunwei.R
import com.xw.yunwei.databinding.ItemWorkManageCarBinding
import com.xw.yunwei.extension.colorIdToColorValue
import com.xw.yunwei.model.CarModel
class CarAdapter(var listener: OnItemClickListener<CarModel>) :
@@ -48,46 +49,9 @@
                )
            )
            binding.batteryView.setLevel(item.currentElectricity ?: 0)
            val setStatus: (Int, Int) -> Unit = { text, bg ->
                binding.status.setTextColor(text)
                binding.status.setBackgroundResource(bg)
            }
            // 1=运营中 2=维修中 3=已收车 4=车辆异常
            when (item.operatingStatus) {
                1 -> {
                    setStatus(
                        getResColor(com.xw.common.R.color.blue_5),
                        com.xw.common.R.color.blue_1
                    )
                    binding.status.text = "运营中"
                }
                2 -> {
                    setStatus(
                        getResColor(com.xw.common.R.color.red_5),
                        com.xw.common.R.color.red_1
                    )
                    binding.status.text = "维修中"
                }
                3 -> {
                    setStatus(
                        getResColor(com.xw.common.R.color.gray_7),
                        com.xw.common.R.color.gray_3
                    )
                    binding.status.text = "已收车"
                }
                4 -> {
                    setStatus(
                        getResColor(com.xw.common.R.color.orange_5),
                        com.xw.common.R.color.orange_1
                    )
                    binding.status.text = "车辆异常"
                }
            }
            binding.status.setBackgroundResource(item.getShowStatusBgResource())
            binding.status.setTextColor(item.getShowStatusTextColor().colorIdToColorValue(it.root.context))
            binding.status.text=item.getShowStatus()
        }
    }
app/src/main/java/com/xw/yunwei/ui/work/car/manage/CarManageActivity.kt
@@ -398,12 +398,15 @@
                        dismiss()
                    }
                }
                setOnDismissListener { binding.filterOverlay.visibility = View.GONE }
            }
        }
        filterDialog?.show()
        binding.filterOverlay.visibility = View.VISIBLE
        // 关键:让软键盘把 BottomSheet 顶上去
        filterDialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
        filterDialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
        filterDialog?.window?.setLayout(
            ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT
        )
app/src/main/res/drawable/shape_blue_1_bg_2.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="@dimen/dp_2" />
    <solid android:color="@color/blue_1" />
</shape>
app/src/main/res/layout/activity_accident_process.xml
@@ -506,7 +506,7 @@
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_66"
            android:layout_height="wrap_content"
            android:background="@color/white"
            app:layout_constraintBottom_toBottomOf="parent">
@@ -516,10 +516,23 @@
                android:background="@color/gray_4" />
            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tv_notice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/dp_12"
                android:layout_centerHorizontal="true"
                android:layout_marginHorizontal="@dimen/dp_28"
                android:text="提交归档后,任务列表不再展示本条事故"
                android:textColor="@color/gray_7"
                android:textSize="@dimen/sp_12" />
            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tvControl"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_40"
                android:layout_centerVertical="true"
                android:layout_below="@id/tv_notice"
                android:layout_marginVertical="@dimen/dp_12"
                android:layout_marginHorizontal="@dimen/dp_28"
                android:background="@drawable/shape_blue_5_bg_4"
                android:gravity="center"
app/src/main/res/layout/activity_car_check.xml
@@ -151,8 +151,8 @@
                        android:layout_width="match_parent"
                        android:layout_height="@dimen/dp_168"
                        android:layout_marginTop="@dimen/dp_10"
                        android:scaleType="centerCrop"
                        android:adjustViewBounds="true"
                        android:scaleType="centerCrop"
                        android:src="@mipmap/img_work_car1" />
                    <androidx.recyclerview.widget.RecyclerView
@@ -182,7 +182,7 @@
                    android:id="@+id/viewDetail"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:layout_marginEnd="@dimen/dp_16"
                    android:onClick="@{viewModel.onClick}"
                    android:padding="4dp"
                    android:text="标准说明"
@@ -207,28 +207,21 @@
                    app:layout_constraintStart_toEndOf="@id/v_point1"
                    app:layout_constraintTop_toBottomOf="@+id/tv1" />
                <com.xw.common.custom.SlideSwitchView
                    android:id="@+id/switch1"
                    android:layout_width="@dimen/dp_110"
                    android:layout_height="@dimen/dp_36"
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_status1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:background="@drawable/shape_gray_3_bg_2"
                    android:textColor="@color/gray_8"
                    android:gravity="center"
                    android:paddingHorizontal="@dimen/dp_8"
                    android:paddingVertical="@dimen/dp_4"
                    android:text="待检测"
                    android:textSize="@dimen/sp_12"
                    app:layout_constraintBottom_toBottomOf="@+id/tv2"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toTopOf="@+id/tv2"
                    app:switchBackgroundColorChecked="@color/gray_3"
                    app:switchBackgroundColorUnchecked="@color/gray_3"
                    app:switchChecked="false"
                    app:switchCornerRadius="@dimen/dp_4"
                    app:switchEnable="false"
                    app:switchTextChecked="检测完成"
                    app:switchTextColorChecked="@color/white"
                    app:switchTextColorUnchecked="@color/white"
                    app:switchTextSize="@dimen/sp_12"
                    app:switchTextUnchecked="待检测"
                    app:switchThumbColorChecked="@color/green_5"
                    app:switchThumbColorUnchecked="@color/gray_6"
                    app:switchThumbCornerRadius="@dimen/dp_4"
                    app:switchThumbMargin="@dimen/dp_2" />
                    app:layout_constraintTop_toTopOf="@+id/tv2" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_label2"
@@ -268,28 +261,21 @@
                    app:layout_constraintStart_toEndOf="@id/v_point2"
                    app:layout_constraintTop_toBottomOf="@+id/rv1" />
                <com.xw.common.custom.SlideSwitchView
                    android:id="@+id/switch2"
                    android:layout_width="@dimen/dp_110"
                    android:layout_height="@dimen/dp_36"
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_status2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:background="@drawable/shape_gray_3_bg_2"
                    android:textColor="@color/gray_8"
                    android:gravity="center"
                    android:paddingHorizontal="@dimen/dp_8"
                    android:paddingVertical="@dimen/dp_4"
                    android:text="待检测"
                    android:textSize="@dimen/sp_12"
                    app:layout_constraintBottom_toBottomOf="@+id/tv3"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toTopOf="@+id/tv3"
                    app:switchBackgroundColorChecked="@color/gray_3"
                    app:switchBackgroundColorUnchecked="@color/gray_3"
                    app:switchChecked="false"
                    app:switchCornerRadius="@dimen/dp_4"
                    app:switchEnable="false"
                    app:switchTextChecked="检测完成"
                    app:switchTextColorChecked="@color/white"
                    app:switchTextColorUnchecked="@color/white"
                    app:switchTextSize="@dimen/sp_12"
                    app:switchTextUnchecked="待检测"
                    app:switchThumbColorChecked="@color/green_5"
                    app:switchThumbColorUnchecked="@color/gray_6"
                    app:switchThumbCornerRadius="@dimen/dp_4"
                    app:switchThumbMargin="@dimen/dp_2" />
                    app:layout_constraintTop_toTopOf="@+id/tv3" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_label3"
@@ -329,28 +315,21 @@
                    app:layout_constraintStart_toEndOf="@id/v_point3"
                    app:layout_constraintTop_toBottomOf="@+id/rv2" />
                <com.xw.common.custom.SlideSwitchView
                    android:id="@+id/switch3"
                    android:layout_width="@dimen/dp_110"
                    android:layout_height="@dimen/dp_36"
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_status3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:background="@drawable/shape_gray_3_bg_2"
                    android:textColor="@color/gray_8"
                    android:gravity="center"
                    android:paddingHorizontal="@dimen/dp_8"
                    android:paddingVertical="@dimen/dp_4"
                    android:text="待检测"
                    android:textSize="@dimen/sp_12"
                    app:layout_constraintBottom_toBottomOf="@+id/tv4"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toTopOf="@+id/tv4"
                    app:switchBackgroundColorChecked="@color/gray_3"
                    app:switchBackgroundColorUnchecked="@color/gray_3"
                    app:switchChecked="false"
                    app:switchCornerRadius="@dimen/dp_4"
                    app:switchEnable="false"
                    app:switchTextChecked="检测完成"
                    app:switchTextColorChecked="@color/white"
                    app:switchTextColorUnchecked="@color/white"
                    app:switchTextSize="@dimen/sp_12"
                    app:switchTextUnchecked="待检测"
                    app:switchThumbColorChecked="@color/green_5"
                    app:switchThumbColorUnchecked="@color/gray_6"
                    app:switchThumbCornerRadius="@dimen/dp_4"
                    app:switchThumbMargin="@dimen/dp_2" />
                    app:layout_constraintTop_toTopOf="@+id/tv4" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_label4"
@@ -392,29 +371,22 @@
                    app:layout_constraintTop_toBottomOf="@+id/rv3"
                    tools:visibility="visible" />
                <com.xw.common.custom.SlideSwitchView
                    android:id="@+id/switch4"
                    android:layout_width="@dimen/dp_110"
                    android:layout_height="@dimen/dp_36"
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_status4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:background="@drawable/shape_gray_3_bg_2"
                    android:textColor="@color/gray_8"
                    android:gravity="center"
                    android:paddingHorizontal="@dimen/dp_8"
                    android:paddingVertical="@dimen/dp_4"
                    android:text="待检测"
                    android:textSize="@dimen/sp_12"
                    android:visibility="gone"
                    app:layout_constraintBottom_toBottomOf="@+id/tv5"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toTopOf="@+id/tv5"
                    app:switchBackgroundColorChecked="@color/gray_3"
                    app:switchBackgroundColorUnchecked="@color/gray_3"
                    app:switchChecked="false"
                    app:switchCornerRadius="@dimen/dp_4"
                    app:switchEnable="false"
                    app:switchTextChecked="检测完成"
                    app:switchTextColorChecked="@color/white"
                    app:switchTextColorUnchecked="@color/white"
                    app:switchTextSize="@dimen/sp_12"
                    app:switchTextUnchecked="待检测"
                    app:switchThumbColorChecked="@color/green_5"
                    app:switchThumbColorUnchecked="@color/gray_6"
                    app:switchThumbCornerRadius="@dimen/dp_4"
                    app:switchThumbMargin="@dimen/dp_2"
                    tools:visibility="visible" />
                <androidx.appcompat.widget.AppCompatTextView
@@ -458,28 +430,21 @@
                    app:layout_constraintStart_toEndOf="@id/v_point5"
                    app:layout_constraintTop_toBottomOf="@+id/rv4" />
                <com.xw.common.custom.SlideSwitchView
                    android:id="@+id/switch5"
                    android:layout_width="@dimen/dp_110"
                    android:layout_height="@dimen/dp_36"
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_status5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:background="@drawable/shape_gray_3_bg_2"
                    android:textColor="@color/gray_8"
                    android:gravity="center"
                    android:paddingHorizontal="@dimen/dp_8"
                    android:paddingVertical="@dimen/dp_4"
                    android:text="待检测"
                    android:textSize="@dimen/sp_12"
                    app:layout_constraintBottom_toBottomOf="@+id/tv6"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toTopOf="@+id/tv6"
                    app:switchBackgroundColorChecked="@color/gray_3"
                    app:switchBackgroundColorUnchecked="@color/gray_3"
                    app:switchChecked="false"
                    app:switchCornerRadius="@dimen/dp_4"
                    app:switchEnable="false"
                    app:switchTextChecked="检测完成"
                    app:switchTextColorChecked="@color/white"
                    app:switchTextColorUnchecked="@color/white"
                    app:switchTextSize="@dimen/sp_12"
                    app:switchTextUnchecked="待检测"
                    app:switchThumbColorChecked="@color/green_5"
                    app:switchThumbColorUnchecked="@color/gray_6"
                    app:switchThumbCornerRadius="@dimen/dp_4"
                    app:switchThumbMargin="@dimen/dp_2" />
                    app:layout_constraintTop_toTopOf="@+id/tv6" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv_label6"
app/src/main/res/layout/activity_car_manage.xml
@@ -99,6 +99,18 @@
            </LinearLayout>
        </androidx.constraintlayout.widget.ConstraintLayout>
        <View
            android:id="@+id/filterOverlay"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="#80000000"
            android:elevation="@dimen/dp_4"
            android:visibility="gone"
            app:layout_constraintTop_toBottomOf="@id/topLayout"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" />
        <androidx.coordinatorlayout.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
app/src/main/res/layout/activity_site_nav.xml
@@ -70,14 +70,16 @@
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="@+id/back" />
            <LinearLayout
                android:id="@+id/searchLayout"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_56"
                android:layout_marginTop="@dimen/dp_88"
                android:gravity="center_vertical"
                android:paddingHorizontal="@dimen/dp_10"
                app:layout_constraintTop_toTopOf="parent">
        </androidx.constraintlayout.widget.ConstraintLayout>
        <LinearLayout
            android:id="@+id/searchLayout"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_56"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:paddingHorizontal="@dimen/dp_10"
            app:layout_constraintTop_toBottomOf="@+id/topLayout">
                <com.xw.yunwei.ui.widget.ClearEditText
                    android:id="@+id/searchEt"
@@ -116,14 +118,12 @@
            </LinearLayout>
        </androidx.constraintlayout.widget.ConstraintLayout>
        <androidx.coordinatorlayout.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:elevation="@dimen/dp_2"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/topLayout">
            app:layout_constraintTop_toBottomOf="@+id/searchLayout">
            <!-- 底部滑动面板 -->
            <LinearLayout
app/src/main/res/layout/dialog_car_filter.xml
@@ -6,154 +6,165 @@
    </data>
    <androidx.core.widget.NestedScrollView
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:paddingBottom="@dimen/dp_10">
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:paddingBottom="@dimen/dp_10">
            android:layout_marginStart="@dimen/dp_20"
            android:layout_marginTop="@dimen/dp_20"
            android:text="车辆状态筛选"
            android:textColor="@color/gray_10"
            android:textSize="@dimen/sp_16"
            android:textStyle="bold"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_20"
                android:layout_marginTop="@dimen/dp_20"
                android:text="车辆状态筛选"
                android:textColor="@color/gray_10"
                android:textSize="@dimen/sp_16"
                android:textStyle="bold"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="@dimen/dp_20"
            android:adjustViewBounds="true"
            android:src="@drawable/svg_close"
            app:layout_constraintBottom_toBottomOf="@+id/title"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="@+id/title" />
            <androidx.appcompat.widget.AppCompatImageView
                android:id="@+id/close"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="@dimen/dp_20"
                android:adjustViewBounds="true"
                android:src="@drawable/svg_close"
                app:layout_constraintBottom_toBottomOf="@+id/title"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="@+id/title" />
        <View
            android:id="@+id/v_line1"
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:layout_marginTop="@dimen/dp_20"
            android:background="@color/gray_4"
            app:layout_constraintTop_toBottomOf="@+id/title" />
            <View
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:layout_marginTop="@dimen/dp_20"
                android:background="@color/gray_4"
                app:layout_constraintTop_toBottomOf="@+id/title" />
        <androidx.core.widget.NestedScrollView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:orientation="vertical"
            app:layout_constraintBottom_toTopOf="@id/v_line2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/v_line1">
            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_20"
                android:layout_marginTop="@dimen/dp_40"
                android:text="运营区域"
                android:textColor="@color/gray_9"
                android:textSize="@dimen/sp_14"
                android:textStyle="bold"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/title" />
            <com.xw.common.custom.ShowTextLinearLayout
                android:id="@+id/stllArea"
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginHorizontal="@dimen/dp_20"
                android:layout_marginTop="@dimen/dp_12"
                android:orientation="vertical"
                app:layout_constraintTop_toBottomOf="@+id/tv"
                app:margin_width="@dimen/dp_8"
                app:max_padding_width="@dimen/dp_12"
                app:min_padding_width="@dimen/dp_12"
                app:padding_height="@dimen/dp_6"
                app:padding_left="0dp"
                app:padding_right="0dp"
                app:text_bg="@drawable/shape_f8f9fa_bg_4"
                app:text_color="@color/gray_9"
                app:text_size="@dimen/sp_12" />
                android:orientation="vertical">
            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tv1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_20"
                android:layout_marginTop="@dimen/dp_20"
                android:text="车辆状态"
                android:textColor="@color/gray_9"
                android:textSize="@dimen/sp_14"
                android:textStyle="bold"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/stllArea" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_20"
                    android:layout_marginTop="@dimen/dp_20"
                    android:text="运营区域"
                    android:textColor="@color/gray_9"
                    android:textSize="@dimen/sp_14"
                    android:textStyle="bold"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/title" />
            <com.xw.common.custom.ShowTextLinearLayout
                android:id="@+id/stllStatus"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginHorizontal="@dimen/dp_20"
                android:layout_marginTop="@dimen/dp_12"
                android:orientation="vertical"
                app:layout_constraintTop_toBottomOf="@+id/tv1"
                app:margin_width="@dimen/dp_8"
                app:max_padding_width="@dimen/dp_12"
                app:min_padding_width="@dimen/dp_12"
                app:padding_height="@dimen/dp_6"
                app:padding_left="0dp"
                app:padding_right="0dp"
                app:text_bg="@drawable/shape_f8f9fa_bg_4"
                app:text_color="@color/gray_9"
                app:text_size="@dimen/sp_12" />
                <com.xw.common.custom.ShowTextLinearLayout
                    android:id="@+id/stllArea"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginHorizontal="@dimen/dp_20"
                    android:layout_marginTop="@dimen/dp_12"
                    android:orientation="vertical"
                    app:layout_constraintTop_toBottomOf="@+id/tv"
                    app:margin_width="@dimen/dp_8"
                    app:max_padding_width="@dimen/dp_12"
                    app:min_padding_width="@dimen/dp_12"
                    app:padding_height="@dimen/dp_6"
                    app:padding_left="0dp"
                    app:padding_right="0dp"
                    app:text_bg="@drawable/shape_f8f9fa_bg_4"
                    app:text_color="@color/gray_9"
                    app:text_size="@dimen/sp_12" />
            <View
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:layout_marginTop="@dimen/dp_20"
                android:background="@color/gray_4"
                app:layout_constraintTop_toBottomOf="@+id/stllStatus" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tv1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_20"
                    android:layout_marginTop="@dimen/dp_20"
                    android:text="车辆状态"
                    android:textColor="@color/gray_9"
                    android:textSize="@dimen/sp_14"
                    android:textStyle="bold"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/stllArea" />
            <com.google.android.material.button.MaterialButton
                android:id="@+id/btnLeft"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_20"
                android:layout_marginTop="@dimen/dp_30"
                android:layout_marginEnd="@dimen/dp_5"
                android:backgroundTint="@color/blue_1"
                android:text="重置"
                android:textColor="@color/blue_5"
                android:textSize="@dimen/sp_16"
                android:textStyle="bold"
                app:cornerRadius="@dimen/dp_4"
                app:layout_constraintHorizontal_weight="1"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toLeftOf="@+id/btnRight"
                app:layout_constraintTop_toBottomOf="@id/stllStatus" />
                <com.xw.common.custom.ShowTextLinearLayout
                    android:id="@+id/stllStatus"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginHorizontal="@dimen/dp_20"
                    android:layout_marginTop="@dimen/dp_12"
                    android:orientation="vertical"
                    app:layout_constraintTop_toBottomOf="@+id/tv1"
                    app:margin_width="@dimen/dp_8"
                    app:max_padding_width="@dimen/dp_12"
                    app:min_padding_width="@dimen/dp_12"
                    app:padding_height="@dimen/dp_6"
                    app:padding_left="0dp"
                    app:padding_right="0dp"
                    app:text_bg="@drawable/shape_f8f9fa_bg_4"
                    app:text_color="@color/gray_9"
                    app:text_size="@dimen/sp_12" />
            </LinearLayout>
        </androidx.core.widget.NestedScrollView>
            <com.google.android.material.button.MaterialButton
                android:id="@+id/btnRight"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_5"
                android:layout_marginTop="@dimen/dp_30"
                android:layout_marginEnd="@dimen/dp_20"
                android:backgroundTint="@color/blue_5"
                android:text="确定"
                android:textColor="@color/white"
                android:textSize="@dimen/sp_16"
                android:textStyle="bold"
                app:cornerRadius="@dimen/dp_4"
                app:layout_constraintHorizontal_weight="1"
                app:layout_constraintLeft_toRightOf="@+id/btnLeft"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@id/stllStatus" />
        <View
            android:id="@+id/v_line2"
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:layout_marginTop="@dimen/dp_260"
            android:background="@color/gray_4"
            app:layout_constraintTop_toBottomOf="@id/v_line1" />
        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnLeft"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/dp_20"
            android:layout_marginTop="@dimen/dp_12"
            android:layout_marginEnd="@dimen/dp_5"
            android:backgroundTint="@color/blue_1"
            android:text="重置"
            android:textColor="@color/blue_5"
            android:textSize="@dimen/sp_16"
            android:textStyle="bold"
            app:cornerRadius="@dimen/dp_4"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toLeftOf="@+id/btnRight"
            app:layout_constraintTop_toBottomOf="@id/v_line2" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.core.widget.NestedScrollView>
        <com.google.android.material.button.MaterialButton
            android:id="@+id/btnRight"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/dp_5"
            android:layout_marginTop="@dimen/dp_12"
            android:layout_marginEnd="@dimen/dp_20"
            android:backgroundTint="@color/blue_5"
            android:text="确定"
            android:textColor="@color/white"
            android:textSize="@dimen/sp_16"
            android:textStyle="bold"
            app:cornerRadius="@dimen/dp_4"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toRightOf="@+id/btnLeft"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/v_line2" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/fragment_car_operations.xml
@@ -131,21 +131,20 @@
                android:orientation="horizontal"
                app:layout_flexBasisPercent="50%">
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_30"
                    android:src="@drawable/svg_car_zhengbei" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_20"
                    android:layout_marginStart="@dimen/dp_18"
                    android:layout_weight="1"
                    android:text="车辆整备"
                    android:textColor="@color/gray_9"
                    android:textSize="@dimen/sp_16" />
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:src="@drawable/svg_car_zhengbei" />
            </LinearLayout>
            <LinearLayout
@@ -159,6 +158,12 @@
                android:orientation="horizontal"
                app:layout_flexBasisPercent="50%">
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_31"
                    android:src="@drawable/svg_car_chongdian" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
@@ -167,12 +172,6 @@
                    android:text="车辆充电"
                    android:textColor="@color/gray_9"
                    android:textSize="@dimen/sp_16" />
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:src="@drawable/svg_car_chongdian" />
            </LinearLayout>
@@ -186,6 +185,11 @@
                android:gravity="center"
                android:orientation="horizontal"
                app:layout_flexBasisPercent="50%">
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_33"
                    android:src="@drawable/svg_car_jiance" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:layout_width="0dp"
@@ -195,13 +199,6 @@
                    android:text="车辆检测"
                    android:textColor="@color/gray_9"
                    android:textSize="@dimen/sp_16" />
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:src="@drawable/svg_car_jiance" />
            </LinearLayout>
            <LinearLayout
@@ -215,20 +212,20 @@
                android:orientation="horizontal"
                app:layout_flexBasisPercent="50%">
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_30"
                    android:src="@drawable/svg_car_weixiu" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_20"
                    android:layout_marginStart="@dimen/dp_18"
                    android:layout_weight="1"
                    android:text="车辆维修"
                    android:textColor="@color/gray_9"
                    android:textSize="@dimen/sp_16" />
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:src="@drawable/svg_car_weixiu" />
            </LinearLayout>
@@ -243,20 +240,20 @@
                android:orientation="horizontal"
                app:layout_flexBasisPercent="50%">
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_31"
                    android:src="@drawable/svg_car_qingjie" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_20"
                    android:layout_marginStart="@dimen/dp_18"
                    android:layout_weight="1"
                    android:text="车身清洁"
                    android:textColor="@color/gray_9"
                    android:textSize="@dimen/sp_16" />
                <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="@dimen/dp_20"
                    android:src="@drawable/svg_car_qingjie" />
            </LinearLayout>
app/src/main/res/layout/fragment_mine.xml
@@ -62,7 +62,7 @@
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_6"
                android:text="@{viewModel.userInfo.phoneNumber}"
                android:textColor="@color/blue_5"
                android:textColor="@color/gray_9"
                android:textSize="@dimen/sp_14"
                app:layout_constraintBottom_toBottomOf="@+id/name"
                app:layout_constraintStart_toEndOf="@+id/name"
app/src/main/res/mipmap-xhdpi/icon_car_charge.png
app/src/main/res/mipmap-xhdpi/icon_car_exception.png
app/src/main/res/mipmap-xhdpi/icon_car_order.png
app/src/main/res/mipmap-xhdpi/icon_car_running.png
app/src/main/res/mipmap-xhdpi/icon_car_stop_order.png
app/src/main/res/mipmap-xhdpi/icon_car_working.png
app/src/main/res/mipmap-xhdpi/img_work_report.png

common/src/main/res/drawable/svg_car_chongdian.xml
@@ -1,3 +1,18 @@
<!--
  ~ Copyright (C) 2026 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="17dp"
    android:height="17dp"
@@ -5,5 +20,6 @@
    android:viewportHeight="17">
  <path
      android:pathData="M12.75,0C13.924,0 14.875,0.951 14.875,2.125L14.875,15.229L16.115,15.229C16.604,15.229 17,15.626 17,16.115C17,16.604 16.604,17 16.115,17L0.885,17C0.396,17 -0,16.604 -0,16.115C-0,15.626 0.396,15.229 0.885,15.229L2.125,15.229L2.125,2.125C2.125,0.951 3.076,0 4.25,0L12.75,0ZM9.507,7.437L6.021,11.377L7.847,11.377L7.349,14.167L11.333,10.064L9.507,10.064L9.507,7.437ZM12.396,2.125L4.604,2.125C4.233,2.125 3.925,2.411 3.898,2.78L3.896,2.833L3.896,5.313C3.896,5.683 4.181,5.991 4.551,6.019L4.604,6.021L12.396,6.021C12.767,6.021 13.075,5.735 13.102,5.366L13.104,5.313L13.104,2.833C13.104,2.442 12.787,2.125 12.396,2.125Z"
      android:fillColor="#31456A"/>
      android:fillColor="#31456A"
      android:fillAlpha="0.8"/>
</vector>
common/src/main/res/drawable/svg_car_jiance.xml
@@ -1,13 +1,25 @@
<!--
  ~ Copyright (C) 2026 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="20dp"
    android:height="20dp"
    android:viewportWidth="20"
    android:viewportHeight="20">
  <group>
    <clip-path
        android:pathData="M0,0h20v20h-20z"/>
    <path
        android:pathData="M17.31,5.64L16,4.1L14.88,2.86C14.408,2.313 13.722,1.999 13,2L5.49,2C4.115,2 3,3.115 3,4.49L3,16.11C3,17.485 4.115,18.6 5.49,18.6L15.49,18.6C16.865,18.6 17.98,17.485 17.98,16.11L17.98,7.29C17.971,6.675 17.732,6.087 17.31,5.64ZM13.19,10.82L10.5,14.14C10.347,14.332 10.116,14.446 9.87,14.45C9.626,14.454 9.393,14.352 9.23,14.17L7.77,12.51C7.524,12.165 7.576,11.691 7.892,11.408C8.208,11.126 8.685,11.127 9,11.41L9.81,12.33L11.9,9.78C12.138,9.319 12.736,9.186 13.146,9.504C13.556,9.822 13.577,10.434 13.19,10.78L13.19,10.82ZM13.79,7.15C13.238,7.15 12.79,6.702 12.79,6.15L12.79,3.15L16.54,7.15L13.79,7.15Z"
        android:fillColor="#31456A"/>
  </group>
    android:width="14.98dp"
    android:height="16.6dp"
    android:viewportWidth="14.98"
    android:viewportHeight="16.6">
  <path
      android:pathData="M14.31,3.64L13,2.1L11.88,0.86C11.408,0.313 10.722,-0.001 10,0L2.49,0C1.115,0 0,1.115 0,2.49L0,14.11C0,15.485 1.115,16.6 2.49,16.6L12.49,16.6C13.865,16.6 14.98,15.485 14.98,14.11L14.98,5.29C14.971,4.676 14.732,4.087 14.31,3.64ZM10.19,8.82L7.5,12.14C7.347,12.333 7.116,12.446 6.87,12.45C6.626,12.454 6.393,12.352 6.23,12.17L4.77,10.51C4.524,10.166 4.576,9.691 4.892,9.409C5.208,9.126 5.685,9.127 6,9.41L6.81,10.33L8.9,7.78C9.138,7.319 9.736,7.187 10.146,7.504C10.556,7.822 10.577,8.435 10.19,8.78L10.19,8.82ZM10.79,5.15C10.238,5.15 9.79,4.702 9.79,4.15L9.79,1.15L13.54,5.15L10.79,5.15Z"
      android:fillColor="#31456A"
      android:fillAlpha="0.8"/>
</vector>
common/src/main/res/drawable/svg_car_qingjie.xml
@@ -1,29 +1,25 @@
<!--
  ~ Copyright (C) 2026 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="20dp"
    android:width="18.75dp"
    android:height="20dp"
    android:viewportWidth="20"
    android:viewportWidth="18.75"
    android:viewportHeight="20">
  <group>
    <clip-path
        android:pathData="M0,0h20v20h-20z"/>
    <path
        android:pathData="M7.985,5.611C9.315,5.418 10.665,5.418 11.995,5.611C12.929,5.793 13.864,5.939 14.745,6.174C15.392,6.329 15.914,6.806 16.127,7.437Q16.698,8.999 17.323,10.533C17.398,10.705 17.623,10.96 17.754,10.942C18.485,10.814 19.187,11.287 19.342,12.014C19.389,12.198 19.389,12.391 19.342,12.576L18.274,12.856C18.34,13.216 18.384,13.581 18.405,13.947L18.405,18.981C18.392,19.287 18.28,19.58 18.086,19.816C17.099,20.001 16.089,20.02 15.096,19.871C14.405,19.444 14.835,18.725 14.611,18.145L5.528,18.145C5.35,18.763 5.247,19.798 5.042,19.871C4.029,20.043 2.994,20.043 1.98,19.871C1.766,19.596 1.648,19.257 1.644,18.908C1.588,18.181 1.588,17.492 1.588,16.783C1.588,15.467 1.588,14.15 1.644,12.824L0.651,12.569C0.619,12.423 0.619,12.271 0.651,12.124C0.932,11.397 1.306,10.835 2.268,10.917C2.381,10.917 2.595,10.698 2.661,10.535C3.019,9.727 3.332,8.899 3.598,8.056C3.972,6.796 5.088,5.9 6.399,5.806C6.913,5.716 7.446,5.652 7.962,5.571L7.99,5.606L7.985,5.611ZM3.848,11.224C7.88,12.052 12.039,12.052 16.071,11.224C15.728,10.218 15.383,9.317 15.14,8.407C14.979,7.685 14.328,7.178 13.588,7.2C11.651,7.118 9.714,7.055 7.776,7.036C7.144,7.06 6.517,7.155 5.907,7.318C5.628,7.372 5.382,7.535 5.225,7.772C4.701,8.871 4.309,10.007 3.85,11.224L3.848,11.224ZM4.642,15.509C4.977,15.527 5.312,15.509 5.642,15.455C5.899,15.399 6.119,15.237 6.25,15.01C6.296,14.874 6.084,14.538 5.895,14.456C5.134,14.11 4.353,13.806 3.558,13.548C3.166,13.423 2.717,13.448 2.624,13.985C2.436,14.776 2.624,15.214 3.231,15.339C3.714,15.415 4.201,15.466 4.689,15.493L4.642,15.509ZM15.416,15.509C15.909,15.475 16.399,15.415 16.885,15.327C17.585,15.173 17.436,14.619 17.416,14.14C17.397,13.66 17.137,13.431 16.755,13.54C15.796,13.817 14.86,14.163 13.952,14.575C13.538,14.766 13.69,15.293 14.157,15.395C14.575,15.455 14.996,15.491 15.418,15.503L15.416,15.509Z"
        android:fillColor="#31456A"/>
    <path
        android:pathData="M11.367,2.201C11.364,2.953 10.751,3.559 9.999,3.556C9.246,3.559 8.634,2.953 8.63,2.201C8.63,1.451 9.999,0 9.999,0C9.999,0 11.367,1.452 11.367,2.201Z"
        android:fillColor="#31456A"/>
    <path
        android:pathData="M11.995,5.611C10.665,5.418 9.315,5.418 7.985,5.611L7.99,5.606L7.962,5.571C7.446,5.652 6.913,5.716 6.399,5.806C5.088,5.9 3.972,6.796 3.598,8.056C3.332,8.899 3.019,9.727 2.661,10.535C2.595,10.698 2.381,10.917 2.268,10.917C1.306,10.835 0.932,11.397 0.651,12.124C0.619,12.271 0.619,12.423 0.651,12.569L1.644,12.824C1.588,14.15 1.588,15.467 1.588,16.783C1.588,17.492 1.588,18.181 1.644,18.908C1.648,19.257 1.766,19.596 1.98,19.871C2.994,20.043 4.029,20.043 5.042,19.871C5.247,19.798 5.35,18.763 5.528,18.145L14.611,18.145C14.694,18.359 14.687,18.592 14.681,18.822C14.671,19.216 14.66,19.602 15.096,19.871C16.089,20.02 17.099,20.001 18.086,19.816C18.28,19.58 18.392,19.287 18.405,18.981L18.405,13.947C18.384,13.581 18.34,13.216 18.274,12.856L19.342,12.576C19.389,12.391 19.389,12.198 19.342,12.014C19.187,11.287 18.485,10.814 17.754,10.942C17.623,10.96 17.398,10.705 17.323,10.533Q16.698,8.999 16.127,7.437C15.914,6.806 15.392,6.329 14.745,6.174C13.864,5.939 12.929,5.793 11.995,5.611ZM16.071,11.224C12.039,12.052 7.881,12.052 3.849,11.224L3.851,11.224C4.309,10.007 4.702,8.872 5.225,7.772C5.383,7.536 5.629,7.373 5.907,7.318C6.518,7.155 7.145,7.06 7.777,7.037C9.714,7.055 11.652,7.118 13.589,7.2C14.329,7.179 14.98,7.685 15.14,8.408C15.384,9.317 15.729,10.218 16.071,11.224ZM5.643,15.453C5.313,15.506 4.977,15.525 4.643,15.507L4.69,15.491C4.202,15.464 3.715,15.413 3.232,15.337C2.624,15.212 2.437,14.774 2.624,13.983C2.718,13.446 3.166,13.421 3.559,13.546C4.354,13.804 5.134,14.107 5.895,14.454C6.085,14.536 6.297,14.872 6.25,15.007C6.12,15.235 5.899,15.397 5.643,15.453ZM16.885,15.325C16.399,15.413 15.909,15.473 15.417,15.507L15.419,15.501C14.997,15.489 14.576,15.453 14.158,15.393C13.691,15.291 13.538,14.764 13.952,14.573C14.86,14.161 15.797,13.815 16.755,13.538C17.137,13.429 17.397,13.658 17.417,14.138C17.419,14.201 17.424,14.265 17.429,14.329C17.461,14.756 17.493,15.192 16.885,15.325Z"
        android:fillColor="#31456A"
        android:fillType="evenOdd"/>
    <path
        android:pathData="M11.367,2.201C11.364,2.953 10.751,3.559 9.999,3.556C9.246,3.559 8.634,2.953 8.63,2.201C8.63,1.451 9.999,0 9.999,0C9.999,0 11.367,1.452 11.367,2.201Z"
        android:fillColor="#31456A"/>
    <path
        android:pathData="M6.746,3.212C6.743,3.723 6.327,4.135 5.816,4.132C5.305,4.135 4.888,3.723 4.886,3.212C4.886,2.703 5.816,1.716 5.816,1.716C5.816,1.716 6.746,2.703 6.746,3.212Z"
        android:fillColor="#31456A"/>
    <path
        android:pathData="M15.113,3.212C15.111,3.723 14.694,4.135 14.183,4.132C13.672,4.135 13.256,3.723 13.253,3.212C13.253,2.703 14.183,1.716 14.183,1.716C14.183,1.716 15.113,2.703 15.113,3.212Z"
        android:fillColor="#31456A"/>
  </group>
  <path
      android:pathData="M7.358,5.611C8.688,5.418 10.038,5.418 11.368,5.611C12.302,5.793 13.237,5.939 14.118,6.174C14.765,6.329 15.287,6.806 15.5,7.437Q16.071,8.999 16.696,10.533C16.771,10.705 16.996,10.96 17.127,10.942C17.858,10.814 18.56,11.287 18.715,12.014C18.762,12.198 18.762,12.391 18.715,12.576L17.647,12.856C17.713,13.216 17.757,13.581 17.778,13.947L17.778,18.981C17.765,19.287 17.653,19.58 17.459,19.816C16.472,20.001 15.462,20.02 14.47,19.871C13.778,19.444 14.208,18.725 13.984,18.145L4.901,18.145C4.723,18.763 4.62,19.798 4.415,19.871C3.402,20.043 2.367,20.043 1.353,19.871C1.139,19.596 1.021,19.257 1.017,18.908C0.961,18.181 0.961,17.492 0.961,16.783C0.961,15.467 0.961,14.15 1.017,12.824L0.024,12.569C-0.008,12.423 -0.008,12.271 0.024,12.124C0.305,11.397 0.679,10.835 1.641,10.917C1.754,10.917 1.968,10.698 2.034,10.535C2.392,9.727 2.705,8.899 2.971,8.056C3.345,6.796 4.461,5.9 5.772,5.806C6.286,5.716 6.819,5.652 7.335,5.571L7.363,5.606L7.358,5.611ZM3.221,11.224C7.253,12.052 11.412,12.052 15.444,11.224C15.101,10.218 14.756,9.317 14.513,8.407C14.352,7.685 13.701,7.178 12.961,7.2C11.024,7.118 9.087,7.055 7.149,7.036C6.517,7.06 5.89,7.155 5.28,7.318C5.001,7.372 4.755,7.535 4.598,7.772C4.074,8.871 3.682,10.007 3.223,11.224L3.221,11.224ZM4.015,15.509C4.35,15.527 4.685,15.509 5.015,15.455C5.272,15.399 5.492,15.237 5.623,15.01C5.669,14.874 5.457,14.538 5.268,14.456C4.507,14.11 3.727,13.806 2.931,13.548C2.539,13.423 2.091,13.448 1.997,13.985C1.809,14.776 1.997,15.214 2.604,15.339C3.087,15.415 3.574,15.466 4.062,15.493L4.015,15.509ZM14.79,15.509C15.282,15.475 15.772,15.415 16.258,15.327C16.958,15.173 16.809,14.619 16.789,14.14C16.77,13.66 16.51,13.431 16.128,13.54C15.169,13.817 14.233,14.163 13.325,14.575C12.911,14.766 13.063,15.293 13.53,15.395C13.948,15.455 14.369,15.491 14.791,15.503L14.79,15.509ZM10.74,2.201C10.737,2.953 10.124,3.559 9.372,3.556C8.62,3.559 8.007,2.953 8.003,2.201C8.003,1.451 9.372,0 9.372,0C9.372,0 10.74,1.452 10.74,2.201ZM6.119,3.212C6.116,3.723 5.7,4.135 5.189,4.132C4.678,4.135 4.261,3.723 4.259,3.212C4.259,2.703 5.189,1.716 5.189,1.716C5.189,1.716 6.119,2.703 6.119,3.212ZM14.486,3.212C14.484,3.723 14.067,4.135 13.556,4.132C13.045,4.135 12.628,3.723 12.626,3.212C12.626,2.703 13.556,1.716 13.556,1.716C13.556,1.716 14.486,2.703 14.486,3.212Z"
      android:fillColor="#31456A"
      android:fillAlpha="0.8"/>
</vector>
common/src/main/res/drawable/svg_car_weixiu.xml
@@ -1,3 +1,18 @@
<!--
  ~ Copyright (C) 2026 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="19.973dp"
    android:height="18.888dp"
@@ -5,5 +20,6 @@
    android:viewportHeight="18.888">
  <path
      android:pathData="M6.923,2.217C6.923,3.434 5.924,4.433 4.707,4.433C3.489,4.433 2.49,3.434 2.49,2.217C2.49,0.999 3.489,0 4.707,0C5.924,0 6.923,0.999 6.923,2.217ZM13.417,12.082C11.544,12.082 10.045,13.612 10.045,15.485C10.045,17.358 11.544,18.888 13.417,18.888C15.29,18.888 16.789,17.358 16.789,15.485C16.789,13.612 15.259,12.082 13.417,12.082ZM13.417,17.046C12.574,17.046 11.856,16.359 11.856,15.485C11.856,14.611 12.543,13.924 13.417,13.924C14.26,13.924 14.978,14.611 14.978,15.485C14.978,16.328 14.26,17.046 13.417,17.046ZM14.322,6.775C14.198,6.244 9.671,1.342 8.516,2.092C7.704,2.622 8.391,3.497 8.391,3.497C9.92,3.871 12.886,7.368 12.886,7.368L8.141,9.21C7.579,9.553 6.549,9.553 6.549,11.458L6.549,14.142C6.549,14.985 7.579,15.922 8.391,15.922L9.171,15.922C9.171,15.922 9.14,15.547 9.14,15.422C9.14,13.081 11.013,11.145 13.323,11.145C15.634,11.145 17.507,13.112 17.507,15.454C17.507,15.61 17.507,15.953 17.476,15.953L19.973,15.953L19.973,4.527L14.322,6.775ZM7.798,11.426C6.892,9.647 10.576,9.553 10.576,9.553L7.798,11.426ZM8.765,7.212C8.765,7.212 7.954,6.65 6.518,7.305C4.644,8.148 4.957,4.87 3.021,4.215C3.021,4.215 1.054,4.215 0.211,7.524C0.211,7.524 -0.444,9.678 0.555,12.519L0.555,17.42C0.555,17.42 1.554,18.981 3.052,17.42L3.052,12.425C3.052,12.425 3.021,9.335 4.176,8.18C4.176,8.18 4.426,9.272 6.361,9.179C6.361,9.21 10.639,8.585 8.765,7.212Z"
      android:fillColor="#31456A"/>
      android:fillColor="#31456A"
      android:fillAlpha="0.8"/>
</vector>
common/src/main/res/drawable/svg_car_zhengbei.xml
@@ -1,3 +1,18 @@
<!--
  ~ Copyright (C) 2026 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="20.006dp"
    android:height="15.955dp"
@@ -5,5 +20,6 @@
    android:viewportHeight="15.955">
  <path
      android:pathData="M7.853,0.159C9.271,-0.053 10.713,-0.053 12.131,0.159C13.128,0.358 14.125,0.518 15.062,0.777C15.76,0.955 16.317,1.478 16.538,2.163Q17.146,3.878 17.814,5.563C17.894,5.753 18.133,6.032 18.273,6.012C19.064,5.878 19.817,6.401 19.968,7.188C20.018,7.391 20.018,7.604 19.968,7.807L18.831,8.116C18.902,8.511 18.948,8.911 18.971,9.312L18.971,14.836C18.958,15.17 18.839,15.491 18.632,15.753C17.58,15.956 16.5,15.976 15.441,15.813C14.703,15.344 15.162,14.557 14.923,13.919L5.231,13.919C5.042,14.597 4.932,15.733 4.713,15.813C3.631,16.003 2.524,16.003 1.442,15.813C1.213,15.508 1.087,15.138 1.083,14.756C1.023,13.959 1.023,13.201 1.023,12.423C1.023,10.977 1.023,9.531 1.083,8.076L0.026,7.797C-0.009,7.636 -0.009,7.469 0.026,7.308C0.325,6.51 0.724,5.892 1.751,5.982C1.871,5.982 2.1,5.743 2.17,5.563C2.551,4.674 2.884,3.766 3.167,2.841C3.551,1.475 4.744,0.492 6.158,0.378C6.707,0.279 7.275,0.209 7.823,0.119L7.853,0.159ZM3.446,6.321C7.746,7.231 12.188,7.231 16.488,6.321C16.119,5.214 15.75,4.227 15.491,3.23C15.332,2.446 14.636,1.888 13.836,1.904C11.772,1.814 9.698,1.744 7.634,1.724C6.96,1.751 6.291,1.855 5.64,2.033C5.34,2.095 5.078,2.275 4.912,2.532C4.354,3.738 3.935,4.985 3.446,6.321ZM4.294,11.027C4.651,11.046 5.008,11.026 5.361,10.967C5.636,10.904 5.872,10.726 6.009,10.479C6.059,10.329 5.829,9.96 5.63,9.871C4.819,9.491 3.987,9.158 3.137,8.873C2.718,8.734 2.24,8.764 2.14,9.352C1.941,10.219 2.14,10.698 2.788,10.838C3.297,10.937 3.785,10.957 4.344,11.007L4.294,11.027ZM15.79,11.027C16.315,10.99 16.838,10.923 17.356,10.828C18.103,10.658 17.944,10.05 17.924,9.522C17.904,8.993 17.625,8.744 17.216,8.863C16.192,9.168 15.192,9.548 14.225,10C13.786,10.21 13.946,10.788 14.444,10.897C14.89,10.964 15.339,11.004 15.79,11.017L15.79,11.027Z"
      android:fillColor="#31456A"/>
      android:fillColor="#31456A"
      android:fillAlpha="0.8"/>
</vector>