| app/src/main/java/com/xw/yunwei/MyApp.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/java/com/xw/yunwei/push/MessageHandler.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/java/com/xw/yunwei/ui/task/accident/detail/AccidentDetailVM.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/java/com/xw/yunwei/ui/task/normal/NormalTaskDetailVM.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/java/com/xw/yunwei/ui/work/checkInMission/RoutePlanningActivity.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/res/layout/activity_accident_detail.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/res/layout/dialog_protocol.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/res/layout/item_protocol.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/res/layout/layout_normal_task_status1.xml | ●●●●● 补丁 | 查看 | 原始文档 | 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