18034727885
2026-06-25 48191b96e2ea527067780326b550fa37abb23058
修复问题
2个文件已添加
8个文件已修改
351 ■■■■■ 已修改文件
app/src/main/java/com/xw/yunwei/MyApp.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/push/MessageHandler.kt 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/task/accident/detail/AccidentDetailVM.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/task/normal/NormalTaskDetailVM.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/checkInMission/RoutePlanningActivity.kt 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_accident_detail.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/dialog_protocol.xml 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_protocol.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_normal_task_status1.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/icon_tick_circle_blue.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/MyApp.kt
@@ -442,8 +442,7 @@
                    dialog2.dismiss()
                }
            }) {
                val comment =
                    if (position == Constants.reasons.lastIndex) input else Constants.reasons[position]
                val comment = Constants.reasons[position]
                taskRepository.taskReassignment(comment, input, taskModel.id.toString()).also {
                    newTaskDialog.dismiss()
                    dialog2.dismiss()
app/src/main/java/com/xw/yunwei/push/MessageHandler.kt
@@ -1,15 +1,14 @@
package com.xw.yunwei.push
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.webkit.WebSettings
import android.webkit.WebView
import android.view.View.inflate
import android.widget.ImageView
import android.widget.TextView
import androidx.databinding.DataBindingUtil
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
@@ -17,9 +16,8 @@
import com.xw.common.utils.MMKVManager
import com.xw.common.utils.ToastUtilCommon
import com.xw.yunwei.MyApp
import com.xw.yunwei.R
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
@@ -30,6 +28,7 @@
import com.xw.yunwei.ui.task.normal.NormalTaskDetailActivity
import com.xw.yunwei.ui.user.mine.protocol.ProtocolActivity
import com.xw.yunwei.ui.user.mine.scheduling.SchedulingActivity
import com.xw.yunwei.ui.work.car.detail.StandardDescriptionActivity
import com.xw.yunwei.utils.DialogFactory
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
@@ -203,13 +202,71 @@
                noVerticalPadding = true,
                dialogWrapContent = true
            )
            cornerRadius(8f)
            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)
                val checked = mutableSetOf<AgreeInfo>()
                fun refreshCheck(imageView: ImageView, checked: Boolean) {
                    imageView.setImageResource(if (checked) R.mipmap.icon_tick_circle_blue else R.mipmap.icon_circle_gray2)
                }
                // bind.btnLeft.text = if (forced) "取消并退出" else "关闭"
                bind.btnLeft.text = "关闭"
                fun checkAllChecked() {
                    (0..<bind.llAgree.childCount).forEachIndexed { index, i ->
                        val checked = checked.contains(list[index])
                        refreshCheck(
                            bind.llAgree.getChildAt(index).findViewById<ImageView>(R.id.iv_check),
                            checked
                        )
                    }
                    refreshCheck(bind.ivCheckAll, checked.size == list.size)
                }
                list.forEach { info ->
                    val itemView = inflate(
                        currentShowActivity,
                        R.layout.item_protocol,
                        null
                    ).apply {
                        findViewById<ImageView>(R.id.iv_check).apply {
                            setOnClickListener {
                                if (checked.contains(info)) {
                                    checked.remove(info)
                                } else {
                                    checked.add(info)
                                }
                                checkAllChecked()
                            }
                        }
                        findViewById<TextView>(R.id.tv_name).apply {
                            text = info.name
                            setOnClickListener {
//                                if (!checked.contains(info)) {
//                                    checked.add(info)
//                                    checkAllChecked()
//                                }
                                currentShowActivity.startActivity(
                                    Intent(
                                        currentShowActivity,
                                        StandardDescriptionActivity::class.java
                                    ).apply {
                                        putExtra("type", info.id?.toInt())
                                        putExtra("webType", 1)
                                        putExtra("title", info.name)
                                    }
                                )
                            }
                        }
                    }
                    bind.llAgree.addView(itemView)
                }
                bind.llCheckAll.setOnClickListener {
                    if (checked.size != list.size) {
                        checked.addAll(list)
                    } else {
                        checked.clear()
                    }
                    checkAllChecked()
                }
                bind.btnLeft.setOnClickListener {
                    dismiss()
                    if (forced) {
@@ -218,73 +275,16 @@
                    }
                }
                bind.btnRight.setOnClickListener {
                    if(checked.size!=list.size){
                        ToastUtilCommon.showError("请勾选全部协议后再确认同意")
                        return@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 ?: "") }
                }
            }
        }
    }
    @SuppressLint("SetJavaScriptEnabled")
    private fun initWeb(webView: WebView) {
        //声明WebSettings子类
        val webSettings = webView.settings
        webSettings.domStorageEnabled = true //设置适应Html5
        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
        webSettings.javaScriptEnabled = true //允许js调用
        webSettings.allowContentAccess = true //是否允许在WebView中访问内容URL(Content Url),默认允许
        //缩放操作
        webSettings.setSupportZoom(true) //支持缩放,默认为true。是下面那个的前提。
        webSettings.builtInZoomControls = true //设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.displayZoomControls = false //隐藏原生的缩放控件
        //其他细节操作
        webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK //关闭webview中缓存
        webSettings.javaScriptCanOpenWindowsAutomatically = true //支持通过JS打开新窗口
        webSettings.loadsImagesAutomatically = true //支持自动加载图片
        webSettings.defaultTextEncodingName = "utf-8" //设置编码格式
        webView.setSafeSetting()//安全设置
    }
    @SuppressLint("SetJavaScriptEnabled")
    private fun setContent(webView: WebView, content: String?) {
        content?.let {
            // 加载并显示HTML代码
            webView.safeLoadDataWithBaseURL(
                null,
                content,
                "text/html",
                "utf-8",
                null
            )
        }
    }
app/src/main/java/com/xw/yunwei/ui/task/accident/detail/AccidentDetailVM.kt
@@ -430,8 +430,7 @@
                ToastUtilCommon.showError(msg)
                LogUtils.e(TAG, "launchRequest: code = $code msg = $msg")
            }) {
                val comment =
                    if (position == Constants.reasons.lastIndex) input else Constants.reasons[position]
                val comment = Constants.reasons[position]
                taskRepository.taskReassignment(comment, input, taskId.toString()).also {
                    dialog.dismiss()
                    checkApplyForReassignResult()
app/src/main/java/com/xw/yunwei/ui/task/normal/NormalTaskDetailVM.kt
@@ -430,8 +430,7 @@
                ToastUtilCommon.showError(msg)
                LogUtils.e(TAG, "launchRequest: code = $code msg = $msg")
            }) {
                val comment =
                    if (position == Constants.reasons.lastIndex) input else Constants.reasons[position]
                val comment = Constants.reasons[position]
                taskRepository.taskReassignment(comment, input, taskId.toString()).also {
                    dialog.dismiss()
                    checkApplyForReassignResult()
app/src/main/java/com/xw/yunwei/ui/work/checkInMission/RoutePlanningActivity.kt
@@ -23,6 +23,7 @@
import com.google.gson.reflect.TypeToken
import com.xw.common.CommonDialog
import com.xw.common.utils.GpsHelper
import com.xw.common.utils.LogUtils
import com.xw.common.utils.ToastUtilCommon
import com.xw.yunwei.BR
import com.xw.yunwei.BaseBusinessActivity
@@ -102,18 +103,18 @@
        super.setObservable()
        viewModel.naviPaths.observe(this) { it ->
            it[0]?.also {
                binding.tvWalkDistance.text =
                binding.tvWalkDistance.text = if (it.naviPaths.isEmpty()) "" else
                    Utils.getFriendlyDistance(it.naviPaths.first().allLength)
                binding.tvWalkCostTime.text =
                binding.tvWalkCostTime.text = if (it.naviPaths.isEmpty()) "路线计算失败" else
                    Utils.getFriendlyTime(it.naviPaths.first().allTime)
                binding.tvWalkPoints.text = "${it.passingPoints.size}个途经点"
                binding.tvWalkPoints.visibility =
                    if (it.passingPoints.isEmpty()) View.GONE else View.VISIBLE
            }
            it[1]?.also {
                binding.tvBicycleDistance.text =
                binding.tvBicycleDistance.text = if (it.naviPaths.isEmpty()) "" else
                    Utils.getFriendlyDistance(it.naviPaths.first().allLength)
                binding.tvBicycleCostTime.text =
                binding.tvBicycleCostTime.text = if (it.naviPaths.isEmpty()) "路线计算失败" else
                    Utils.getFriendlyTime(it.naviPaths.first().allTime)
                binding.tvBicyclePoints.text = "${it.passingPoints.size}个途经点"
                binding.tvBicyclePoints.visibility =
@@ -180,6 +181,9 @@
                    if (!it) com.xw.common.R.color.blue_5 else com.xw.common.R.color.gray_9
                )
            )
            binding.btnPlan.setBackgroundResource(
                if (viewModel.naviPaths.value?.get(if (it) 0 else 1)?.naviPaths?.isNotEmpty() == true) R.drawable.shape_blue_5_bg_4 else R.drawable.shape_gray_5_bg_4
            )
        }
        viewModel.couldNavi.observe(this) {
            binding.btnPlan.setBackgroundResource(
@@ -207,6 +211,14 @@
        binding.btnPlan.setOnClickListener {
            if (!(viewModel.couldNavi.value ?: false)) {
                ToastUtilCommon.showError("请等待路线初始化完成")
                return@setOnClickListener
            }
            if (viewModel.checkWalk.value == true && viewModel.naviPaths.value?.get(0)?.naviPaths?.isNotEmpty() != true) {
                LogUtils.d(TAG, "步行导航路线计算失败")
                return@setOnClickListener
            }
            if (viewModel.checkWalk.value == false && viewModel.naviPaths.value?.get(1)?.naviPaths?.isNotEmpty() != true) {
                LogUtils.d(TAG, "骑行导航路线计算失败")
                return@setOnClickListener
            }
            if (!isNetworkAvailableLegacy()) {
@@ -283,6 +295,7 @@
                        }
                    }
                }
                override fun onCalculateRouteSuccess(p0: AMapCalcRouteResult?) {
                    it.removeAMapNaviListener(this)
                    super.onCalculateRouteSuccess(p0)
@@ -305,6 +318,12 @@
                    it.removeAMapNaviListener(this)
                    super.onCalculateRouteFailure(p0)
                    Log.d(TAG, "步行路线计算失败,$p0")
                    if (viewModel.naviPaths.value?.get(0) != null) {
                        return
                    }
                    val map = viewModel.naviPaths.value ?: mutableMapOf()
                    map[0] = RoutePlanningOperationInfo(0, passingPoints, routePlanningEndPoint)
                    viewModel.naviPaths.postValue(map.toMutableMap())
                    block.invoke()
                }
            }
@@ -356,6 +375,9 @@
                    it.removeAMapNaviListener(this)
                    super.onCalculateRouteFailure(p0)
                    Log.d(TAG, "骑行路线计算失败,$p0")
                    val info = RoutePlanningOperationInfo(1, passingPoints, routePlanningEndPoint)
                    val map = viewModel.naviPaths.value ?: mutableMapOf()
                    map[1] = info
                    block.invoke()
                }
            }
@@ -421,6 +443,9 @@
            clearRouteFromMap()
            it.moveCamera(CameraUpdateFactory.changeTilt(0f))
            it.clear()
            if (routePlanningOperationInfo.naviPaths.isEmpty()) {
                return@also
            }
            val naviPath = routePlanningOperationInfo.naviPaths.first()
            routeOverLay = RouteOverLay(it, naviPath, this).apply {
                setTrafficLine(true)
app/src/main/res/layout/activity_accident_detail.xml
@@ -202,10 +202,10 @@
                        <androidx.appcompat.widget.AppCompatTextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginTop="@dimen/dp_5"
                            android:layout_marginTop="@dimen/dp_8"
                            android:text="倒计时结束前,务必到达现场"
                            android:textColor="@{viewModel.showRed?@color/red_5:@color/blue_5}"
                            android:textSize="@dimen/sp_14" />
                            android:textSize="@dimen/sp_12" />
                    </LinearLayout>
@@ -233,7 +233,7 @@
                            android:gravity="center"
                            android:text="系统已自动通知相关负责人,请尽快处理该事故单!"
                            android:textColor="#ffEC5340"
                            android:textSize="@dimen/sp_14"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold" />
                    </LinearLayout>
@@ -275,7 +275,7 @@
                        android:layout_marginTop="@dimen/dp_4"
                        android:text="@{viewModel.carLocation.tips}"
                        android:textColor="@color/red_5"
                        android:textSize="@dimen/sp_11"
                        android:textSize="@dimen/sp_12"
                        android:visibility="gone"
                        app:layout_constraintStart_toStartOf="@id/et_input"
                        app:layout_constraintTop_toBottomOf="@id/et_input"
app/src/main/res/layout/dialog_protocol.xml
@@ -1,61 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <RelativeLayout
        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="@dimen/dp_32"
            android:text="协议更新通知"
            android:textColor="@color/gray_10"
            android:textSize="@dimen/sp_18"
            android:textStyle="bold" />
        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginHorizontal="@dimen/dp_20"
            android:layout_marginTop="@dimen/dp_16"
            android:text="为保障您的使用权益与数据安全,我们对以下平台相关协议内容进行优化更新,更新内容不影响原有服务。"
            android:textColor="@color/gray_9"
            android:textSize="@dimen/sp_14" />
        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/dp_20"
            android:layout_marginTop="@dimen/dp_16"
            android:text="我已阅读并同意"
            android:textColor="@color/gray_9"
            android:textSize="@dimen/sp_14"
            android:textStyle="bold" />
        <LinearLayout
            android:id="@+id/ll_agree"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_450"
            app:layout_constraintBottom_toTopOf="@+id/btnLeft"
            app:layout_constraintTop_toTopOf="parent">
            android:layout_height="wrap_content"
            android:paddingVertical="@dimen/dp_8"
            android:orientation="vertical"
            android:paddingHorizontal="@dimen/dp_20" />
            <include
                android:id="@+id/protocolLayout"
                layout="@layout/layout_protocol" />
        <LinearLayout
            android:id="@+id/ll_check_all"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/dp_32"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:paddingHorizontal="@dimen/dp_20">
        </RelativeLayout>
            <androidx.appcompat.widget.AppCompatImageView
                android:id="@+id/iv_check_all"
                android:layout_width="@dimen/dp_20"
                android:layout_height="@dimen/dp_20"
                android:src="@mipmap/icon_circle_gray2" />
            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_4"
                android:text="全部勾选"
                android:textColor="@color/gray_9"
                android:textSize="@dimen/sp_14"
                android:textStyle="bold" />
        </LinearLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:layout_marginTop="@dimen/dp_30"
            android:background="@color/gray_4"
            app:layout_constraintBottom_toTopOf="@+id/btnLeft" />
            android:background="@color/gray_4" />
        <Button
            android:id="@+id/btnLeft"
            android:layout_width="0dp"
            android:layout_height="@dimen/dp_50"
            android:layout_marginTop="@dimen/dp_30"
            android:background="@android:color/transparent"
            android:text="关闭"
            android:textColor="@color/gray_7"
            android:textSize="@dimen/sp_14"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toLeftOf="@+id/btnRight" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_60"
            android:orientation="horizontal">
        <Button
            android:id="@+id/btnRight"
            android:layout_width="0dp"
            android:layout_height="@dimen/dp_50"
            android:layout_marginTop="@dimen/dp_30"
            android:background="@android:color/transparent"
            android:text="同意并继续"
            android:textColor="@color/blue_5"
            android:textSize="@dimen/sp_14"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_weight="1"
            app:layout_constraintLeft_toRightOf="@+id/btnLeft"
            app:layout_constraintRight_toRightOf="parent" />
            <Button
                android:id="@+id/btnLeft"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:text="不同意"
                android:textColor="@color/gray_10"
                android:textSize="@dimen/sp_16"
                android:textStyle="bold" />
    </androidx.constraintlayout.widget.ConstraintLayout>
            <Button
                android:id="@+id/btnRight"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:text="同意"
                android:textColor="@color/blue_5"
                android:textSize="@dimen/sp_16"
                android:textStyle="bold" />
        </LinearLayout>
    </LinearLayout>
</layout>
app/src/main/res/layout/item_protocol.xml
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingVertical="@dimen/dp_8"
    android:orientation="horizontal">
    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/iv_check"
        android:layout_width="@dimen/dp_20"
        android:layout_height="@dimen/dp_20"
        android:src="@mipmap/icon_circle_gray2" />
    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/dp_4"
        android:text="全部勾选"
        android:textColor="@color/blue_5"
        android:textSize="@dimen/sp_14" />
</LinearLayout>
app/src/main/res/layout/layout_normal_task_status1.xml
@@ -115,7 +115,7 @@
                    android:layout_marginTop="@dimen/dp_4"
                    android:text="@{viewModel.carLocation.tips}"
                    android:textColor="@color/red_5"
                    android:textSize="@dimen/sp_11"
                    android:textSize="@dimen/sp_12"
                    android:visibility="gone"
                    app:layout_constraintStart_toStartOf="@id/et_input"
                    app:layout_constraintTop_toBottomOf="@id/et_input"
app/src/main/res/mipmap-xhdpi/icon_tick_circle_blue.png