diff --git a/app/build.gradle b/app/build.gradle index 027eb8ae..ab7fa750 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,6 +115,18 @@ dependencies { //kotlin反射 implementation "org.jetbrains.kotlin:kotlin-stdlib:1.7.0" implementation "org.jetbrains.kotlin:kotlin-reflect:1.7.0" + + implementation 'com.permissionx.guolindev:permissionx:1.4.0' + def camerax_version = "1.1.0-alpha04" + // The following line is optional, as the core library is included indirectly by camera-camera2 + implementation "androidx.camera:camera-core:${camerax_version}" + implementation "androidx.camera:camera-camera2:${camerax_version}" + // If you want to additionally use the CameraX Lifecycle library + implementation "androidx.camera:camera-lifecycle:${camerax_version}" + // If you want to additionally use the CameraX View class + implementation "androidx.camera:camera-view:1.0.0-alpha24" + + implementation 'com.google.mlkit:barcode-scanning:16.1.1' } //允许引用生成的代码 kapt { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 449d6cf9..d84e4a52 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,11 @@ android:versionCode="3" android:versionName="1.4" package="com.navinfo.omqs"> + + + @@ -31,7 +36,13 @@ + + + + + + + + + + + + diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 328830fe..a885a6ea 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -52,6 +52,11 @@ class Constant { * */ var LAYER_CONFIG_LIST: List? = null + /** + * 室内整理工具IP + */ + lateinit var INDOOR_IP: String + const val DEBUG = true var IS_VIDEO_SPEED by kotlin.properties.Delegates.notNull() diff --git a/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt b/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt index 7f257d6e..b1418d1d 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt @@ -38,8 +38,8 @@ data class EvaluationInfo( @SerializedName("problemLink") val problemLink: String = "",//问题环节 - @SerializedName("problemReason") - val problemReason: String = "",//问题原因 + @SerializedName("preliminaryAnalysis") + val preliminaryAnalysis: String = "",//初步分析 @SerializedName("evaluatorName") val evaluatorName: String = "",//测评人名称 diff --git a/app/src/main/java/com/navinfo/omqs/bean/IndoorConnectionInfoBean.kt b/app/src/main/java/com/navinfo/omqs/bean/IndoorConnectionInfoBean.kt new file mode 100644 index 00000000..3cc05594 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/bean/IndoorConnectionInfoBean.kt @@ -0,0 +1,11 @@ +package com.navinfo.omqs.bean + +data class IndoorConnectionInfoBean( + var username: String = "", + var uname: String = "", + var userid: String = "", + var token: String = "", + var baseurl: String = "", + var plate: String = "", + var platform: String = "Android", +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/bean/QRCodeBean.kt b/app/src/main/java/com/navinfo/omqs/bean/QRCodeBean.kt new file mode 100644 index 00000000..4790dd17 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/bean/QRCodeBean.kt @@ -0,0 +1,6 @@ +package com.navinfo.omqs.bean + +data class QRCodeBean( + var errcode: Int = -1, + var msg: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt b/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt new file mode 100644 index 00000000..db19a444 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt @@ -0,0 +1,49 @@ +package com.navinfo.omqs.bean + +data class RoadNameBean( + /** + * 道路名称 + */ + val name: String = "", + /** + * 0 普通 + * 1 立交桥名(连接路) + * 2 立交桥名 (主路) + * 3 风景线路 + * 5 隧道 + * 6 虚拟名称 + */ + val type: Int = 0, + /** + * 1 不论“名称分类”是官方名,别名还是曾用名都统一从1开始递增 + * 2 若取第一官方名时,需判断“名称”分类 [nameClass]=="官方名",且[seqNum] 最小的 + */ + val seqNum: Int = 1, + /** + * 1 官方名 + * 2 别名 + * 3 曾用名 + */ + val nameClass: Int = 1, +) { + fun getNameClassStr(): String { + when (nameClass) { + 1 -> return "官方名" + 2 -> return "别名" + 3 -> return "曾用名" + } + return "" + } + + fun getTypeStr(): String { + when (type) { + 0 -> return "普通" + 1 -> return "立交桥名(连接路)" + 2 -> return "立交桥名(主路)" + 3 -> return "风景线路" + 5 -> return "隧道" + 6 -> return "虚拟名称" + } + return "" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt index b5faa214..745cc0fb 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt @@ -1,6 +1,7 @@ package com.navinfo.omqs.bean import android.os.Parcelable +import com.navinfo.collect.library.data.entity.RenderEntity import kotlinx.parcelize.Parcelize @Parcelize @@ -11,20 +12,16 @@ data class SignBean( val distance: Int = 0, //左上图标中的文字 val iconText: String = "", - //绑定的要素id - val elementId: String = "", //绑定的linkid val linkId: String, - //坐标 - val geometry: String, //名称 val name: String, + //是否要展示详细信息 + val isMoreInfo: Boolean = false, //底部右侧文字 val bottomRightText: String = "", - //要素code类型 - val elementCode: Int, - //需要展示更多的内容 - val moreText: String = "", - //左上角信息 - val topRightText: String = "" + //捕捉数据 + val renderEntity: RenderEntity, + //道路信息排序用的字段 + val index: Int = 0 ) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index 556bb376..a5f70604 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -27,9 +27,9 @@ class ImportPreProcess { Log.d("checkCircleRoad", "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")},LinkOutEntity: ${linkOutId}- ${linkOutEntity?.properties?.get("enodePid")}") // 查询linkIn的sNode和linkOut的eNode是否相同,如果相同,认为数据是环形路口,返回false if (linkInEntity!=null&&linkOutEntity!=null) { - if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] - || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"]|| linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"]) - return false + if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"] || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"]|| linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"]) { + return false + } } return true } @@ -290,6 +290,8 @@ class ImportPreProcess { referenceEntity.properties["qi_table"] = renderEntity.table referenceEntity.properties["currentDirect"] = laneInfoDirectArray[i].toString().split(",").distinct().joinToString("_") referenceEntity.properties["currentType"] = laneInfoTypeArray[i].toString().split(",").distinct().joinToString("_") + referenceEntity.properties["symbol"] = "assets:omdb/4601/bus/1301_"+referenceEntity.properties["currentDirect"]+".svg" + Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString()) Realm.getDefaultInstance().insert(referenceEntity) } } diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt index 30aef395..8edb79c4 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -44,7 +44,7 @@ class RealmOperateHelper() { ) // 根据polygon查询相交的tile号 val tileXSet = mutableSetOf() - tileXSet.toString() + GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet) val tileYSet = mutableSetOf() GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet) diff --git a/app/src/main/java/com/navinfo/omqs/db/dao/ScProblemTypeDao.kt b/app/src/main/java/com/navinfo/omqs/db/dao/ScProblemTypeDao.kt index b1e163d2..3940ed99 100644 --- a/app/src/main/java/com/navinfo/omqs/db/dao/ScProblemTypeDao.kt +++ b/app/src/main/java/com/navinfo/omqs/db/dao/ScProblemTypeDao.kt @@ -30,8 +30,8 @@ interface ScProblemTypeDao { /** * 获取问题分类,并去重 */ - @Query("select DISTINCT CLASS_TYPE from ScProblemType order by CLASS_TYPE") - suspend fun findClassTypeList(): List? + @Query("select * from ScProblemType group by CLASS_TYPE") + suspend fun findClassTypeList(): List? @Query("select DISTINCT CLASS_TYPE from ScProblemType where ELEMENT_CODE=:code") suspend fun findClassTypeByCode(code: Int): String? diff --git a/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt b/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt index 5fe4dd2d..beca12b6 100644 --- a/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt +++ b/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt @@ -2,7 +2,9 @@ package com.navinfo.omqs.http import com.navinfo.omqs.bean.OfflineMapCityBean import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.omqs.bean.IndoorConnectionInfoBean import com.navinfo.omqs.bean.LoginUserBean +import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SysUserBean import okhttp3.ResponseBody import retrofit2.Response @@ -15,14 +17,25 @@ interface NetworkService { /** * 获取离线地图城市列表 */ - suspend fun getOfflineMapCityList():NetResult> + suspend fun getOfflineMapCityList(): NetResult> + /** * 获取任务列表 */ - suspend fun getTaskList(evaluatorNo:String): NetResult>> + suspend fun getTaskList(evaluatorNo: String): NetResult>> /** * 登录接口 */ suspend fun loginUser(loginUserBean: LoginUserBean): NetResult> + + /** + * 连接室内整理工具 + */ + suspend fun connectIndoorTools(url: String): NetResult + + /** + * 更新用户信息 + */ + suspend fun updateServerInfo(url: String,indoorConnectionInfoBean: IndoorConnectionInfoBean): NetResult } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt b/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt index 374bd7e6..5bcd2782 100644 --- a/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt +++ b/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt @@ -2,7 +2,9 @@ package com.navinfo.omqs.http import com.navinfo.omqs.bean.OfflineMapCityBean import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.omqs.bean.IndoorConnectionInfoBean import com.navinfo.omqs.bean.LoginUserBean +import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SysUserBean import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -75,4 +77,42 @@ class NetworkServiceImpl @Inject constructor( NetResult.Error(e) } } + + override suspend fun connectIndoorTools(url: String): NetResult = + //在IO线程中运行 + withContext(Dispatchers.IO) { + return@withContext try { + val result = netApi.retrofitConnectIndoorTools(url = url) + if (result.isSuccessful) { + if (result.code() == 200) { + NetResult.Success(result.body()) + } else { + NetResult.Failure(result.code(), result.message()) + } + } else { + NetResult.Failure(result.code(), result.message()) + } + } catch (e: Exception) { + NetResult.Error(e) + } + } + + override suspend fun updateServerInfo(url: String,indoorConnectionInfoBean: IndoorConnectionInfoBean): NetResult = + //在IO线程中运行 + withContext(Dispatchers.IO) { + return@withContext try { + val result = netApi.retrofitUpdateServerInfo(url,indoorConnectionInfoBean) + if (result.isSuccessful) { + if (result.code() == 200) { + NetResult.Success(result.body()) + } else { + NetResult.Failure(result.code(), result.message()) + } + } else { + NetResult.Failure(result.code(), result.message()) + } + } catch (e: Exception) { + NetResult.Error(e) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/http/RetrofitNetworkServiceAPI.kt b/app/src/main/java/com/navinfo/omqs/http/RetrofitNetworkServiceAPI.kt index 67136348..2f56bbab 100644 --- a/app/src/main/java/com/navinfo/omqs/http/RetrofitNetworkServiceAPI.kt +++ b/app/src/main/java/com/navinfo/omqs/http/RetrofitNetworkServiceAPI.kt @@ -3,7 +3,9 @@ package com.navinfo.omqs.http import com.navinfo.omqs.bean.EvaluationInfo import com.navinfo.omqs.bean.OfflineMapCityBean import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.omqs.bean.IndoorConnectionInfoBean import com.navinfo.omqs.bean.LoginUserBean +import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SysUserBean import okhttp3.ResponseBody import retrofit2.Response @@ -64,6 +66,22 @@ interface RetrofitNetworkServiceAPI { @Query("evaluatorNo") evaluatorNo: String, ): Response>> + + + /** + * 连接室内整理工具 + */ + @Streaming + @GET + suspend fun retrofitConnectIndoorTools(@Url url: String): Response + + /** + * 登录接口 + */ + @Headers("Content-Type: application/json") + @POST + suspend fun retrofitUpdateServerInfo(@Url url: String,@Body indoorConnectionInfoBean: IndoorConnectionInfoBean): Response + @Headers("Content-Type: application/json") @POST("/devcp/uploadSceneProblem") suspend fun postRequest(@Body listEvaluationInfo: List?): Response> diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index e7534861..78101d7a 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -146,12 +146,12 @@ class TaskUploadScope( markId = hadLinkDvoBean.mesh,//"20065597" trackPhotoNumber = "", markGeometry = it.geometry, - featureName = it.classType, + featureName = it.classCode, problemType = problemType, problemPhenomenon = it.phenomenon, problemDesc = it.description, problemLink = it.problemLink, - problemReason = it.cause, + preliminaryAnalysis = it.cause, evaluatorName = it.checkUserId, evaluationDate = it.checkTime, evaluationWay = evaluationWay, @@ -166,10 +166,17 @@ class TaskUploadScope( bodyList.add(evaluationInfo) } }else{ + val linkStatus = 1 + //存在原因标记未测评 + if(hadLinkDvoBean.reason.isNotEmpty()){ + val linkStatus = 0 + }else{ + val linkStatus = 1 + } val evaluationInfo = EvaluationInfo( evaluationTaskId = taskBean.id.toString(), linkPid = hadLinkDvoBean.linkPid,//"84207223282277331" - linkStatus = 0, + linkStatus = linkStatus, markId = hadLinkDvoBean.mesh,//"20065597" trackPhotoNumber = "", markGeometry = "", @@ -178,13 +185,13 @@ class TaskUploadScope( problemPhenomenon = "", problemDesc = "", problemLink = "", - problemReason = "", + preliminaryAnalysis = "", evaluatorName = "", evaluationDate = "", evaluationWay = 2, roadClassfcation = "", roadFunctionGrade = "", - noEvaluationreason = "", + noEvaluationreason = hadLinkDvoBean.reason, linkLength = 0.0, dataLevel = "", linstringLength = 0.0, diff --git a/app/src/main/java/com/navinfo/omqs/server/TimeTask.kt b/app/src/main/java/com/navinfo/omqs/server/TimeTask.kt new file mode 100644 index 00000000..1ccdbb02 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/server/TimeTask.kt @@ -0,0 +1,131 @@ +package com.navinfo.omqs.server + +import android.annotation.SuppressLint +import android.app.AlarmManager +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Build +import android.os.SystemClock + +/** + * date:2023/6/18 + * author:qj + * description:定时器 + */ +class TimeTask(context: Context, actionName: String, task: T) { + + private var mContext: Context? + private val mActionName: String + private var mReceiver: TimeTaskReceiver? = null + private val mTask: T? + + companion object { + private var mPendingIntent: PendingIntent? = null + } + + init { + mContext = context + mActionName = actionName + mTask = task + initReceiver(context, actionName) + } + + fun startLooperTask() { + if (null != mTask) { + mTask.exeTask() + configureAlarmManager(mTask.period()) + } + } + + fun stopLooperTask() { + cancelAlarmManager() + } + + fun onClose() { + mContext!!.unregisterReceiver(mReceiver) + mContext = null + } + + @SuppressLint("ObsoleteSdkInt") + private fun configureAlarmManager(time: Long) { + val manager = mContext!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager + val pendIntent = pendingIntent + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> { + manager.setExactAndAllowWhileIdle( + AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + time, + pendIntent + ) + } + Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT -> { + manager.setExact( + AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + time, + pendIntent + ) + } + else -> { + manager[AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + time] = pendIntent + } + } + } + + @get:SuppressLint("UnspecifiedImmutableFlag") + private val pendingIntent: PendingIntent? + get() { + if (mPendingIntent == null) { + val requestCode = 0 + val intent = Intent() + intent.action = mActionName + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + mPendingIntent = PendingIntent.getBroadcast( + mContext, requestCode, intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE + ) + } + else -> { + mPendingIntent = PendingIntent.getBroadcast( + mContext, + requestCode, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ) + } + } + } + return mPendingIntent + } + + private fun cancelAlarmManager() { + val manager = mContext!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager + manager.cancel(pendingIntent) + } + + private fun initReceiver(context: Context, actionName: String) { + mReceiver = TimeTaskReceiver() + val intentFilter = IntentFilter() + intentFilter.addAction(actionName) + context.registerReceiver(mReceiver, intentFilter) + } + + internal inner class TimeTaskReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + startLooperTask() + } + } + + interface Task { + fun period(): Long { + // 默认时间5S + return 5000L + } + + fun exeTask() + } +} diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/CheckPermissionsActivity.java b/app/src/main/java/com/navinfo/omqs/ui/activity/CheckPermissionsActivity.java index 6690ea72..00150288 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/CheckPermissionsActivity.java +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/CheckPermissionsActivity.java @@ -37,7 +37,8 @@ public class CheckPermissionsActivity extends BaseActivity { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.RECORD_AUDIO + Manifest.permission.RECORD_AUDIO, + Manifest.permission.CAMERA, }; private static final int PERMISSON_REQUESTCODE = 0; @@ -53,6 +54,7 @@ public class CheckPermissionsActivity extends BaseActivity { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO, + Manifest.permission.CAMERA, BACKGROUND_LOCATION_PERMISSION }; } diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index d1a82fbd..e9d14e89 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -31,6 +31,7 @@ import com.navinfo.omqs.ui.activity.BaseActivity import com.navinfo.omqs.ui.fragment.console.ConsoleFragment import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment +import com.navinfo.omqs.ui.fragment.signMoreInfo.SignMoreInfoFragment import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration import com.navinfo.omqs.util.FlowEventBus @@ -56,10 +57,11 @@ class MainActivity : BaseActivity() { */ private var leftFragment: Fragment? = null + /** * 是否开启右侧面板 */ - var switchFragment = false + private var switchFragment = false /** * 检测是否含有tts插件 @@ -88,6 +90,7 @@ class MainActivity : BaseActivity() { */ private val signAdapter by lazy { SignAdapter(object : OnSignAdapterClickListener { + //点击看板进去问题反馈面板 override fun onItemClick(signBean: SignBean) { rightController.currentDestination?.let { if (it.id == R.id.RightEmptyFragment) { @@ -99,14 +102,15 @@ class MainActivity : BaseActivity() { } } + //点击详细信息 override fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) { - if (binding.mainActivitySignMoreInfoGroup.visibility != View.VISIBLE || selectTag != tag) { - binding.mainActivitySignMoreInfoGroup.visibility = View.VISIBLE - binding.mainActivitySignMoreInfoTitle.text = signBean.name - binding.mainActivitySignMoreInfoText1.text = signBean.bottomRightText - binding.mainActivitySignMoreInfoText2.text = signBean.moreText - } else { - binding.mainActivitySignMoreInfoGroup.visibility = View.GONE + viewModel.showSignMoreInfo(signBean.renderEntity) + val fragment = + supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) + if (fragment == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.main_activity_sign_more_info_fragment, SignMoreInfoFragment()) + .commit() } } @@ -120,10 +124,6 @@ class MainActivity : BaseActivity() { } } } - - override fun onHideMoreInfoView() { - binding.mainActivitySignMoreInfoGroup.visibility = View.GONE - } }) } @@ -150,8 +150,6 @@ class MainActivity : BaseActivity() { checkIntent.action = TextToSpeech.Engine.ACTION_CHECK_TTS_DATA someActivityResultLauncher.launch(checkIntent) - - binding = DataBindingUtil.setContentView(this, R.layout.activity_main) //初始化地图 @@ -184,12 +182,12 @@ class MainActivity : BaseActivity() { } v?.onTouchEvent(event) ?: true } - + //捕捉列表变化回调 viewModel.liveDataQsRecordIdList.observe(this) { //处理页面跳转 viewModel.navigationRightFragment(this, it) } - + //右上角菜单是否被点击 viewModel.liveDataMenuState.observe(this) { binding.mainActivityMenu.isSelected = it if (it == true) { @@ -198,6 +196,17 @@ class MainActivity : BaseActivity() { binding.mainActivityMenuGroup.visibility = View.INVISIBLE } } + //道路绑定,名称变化 + viewModel.liveDataRoadName.observe(this) { + if (it != null) { + binding.mainActivityRoadName.text = it.properties["name"] + if (binding.mainActivityRoadName.visibility != View.VISIBLE) binding.mainActivityRoadName.visibility = + View.VISIBLE + } else { + if (binding.mainActivityRoadName.visibility != View.GONE) binding.mainActivityRoadName.visibility = + View.GONE + } + } //道路属性面板 binding.mainActivityTopSignRecyclerview.layoutManager = LinearLayoutManager( @@ -228,15 +237,14 @@ class MainActivity : BaseActivity() { viewModel.liveDataTopSignList.observe(this) { topSignAdapter.refreshData(it) } + //监听地图中点变化 viewModel.liveDataCenterPoint.observe(this) { -// Log.e("qj", "${it.longitude}") try { if (it != null && it.longitude != null && it.latitude != null) { binding.mainActivityGeometry.text = "经纬度:${ BigDecimal(it.longitude).setScale( - 7, - RoundingMode.HALF_UP + 7, RoundingMode.HALF_UP ) },${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}" } @@ -245,6 +253,16 @@ class MainActivity : BaseActivity() { } } + viewModel.liveDataSignMoreInfo.observe(this){ + val fragment = + supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) + if (fragment == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.main_activity_sign_more_info_fragment, SignMoreInfoFragment()) + .commit() + } + } + lifecycleScope.launch { // 初始化地图图层控制接收器 FlowEventBus.subscribe>( @@ -475,8 +493,7 @@ class MainActivity : BaseActivity() { } leftFragment = TaskManagerFragment { binding.mainActivityLeftFragment.visibility = View.GONE - supportFragmentManager.beginTransaction() - .remove(leftFragment!!).commit() + supportFragmentManager.beginTransaction().remove(leftFragment!!).commit() leftFragment = null null } @@ -496,8 +513,7 @@ class MainActivity : BaseActivity() { } leftFragment = QsRecordListFragment { binding.mainActivityLeftFragment.visibility = View.GONE - supportFragmentManager.beginTransaction() - .remove(leftFragment!!).commit() + supportFragmentManager.beginTransaction().remove(leftFragment!!).commit() leftFragment = null null } @@ -524,8 +540,7 @@ class MainActivity : BaseActivity() { } leftFragment = OfflineMapFragment { binding.mainActivityLeftFragment.visibility = View.GONE - supportFragmentManager.beginTransaction() - .remove(leftFragment!!).commit() + supportFragmentManager.beginTransaction().remove(leftFragment!!).commit() leftFragment = null null } @@ -533,4 +548,13 @@ class MainActivity : BaseActivity() { .replace(R.id.main_activity_left_fragment, leftFragment!!).commit() } } + + /** + * 打开道路名称属性看板,选择的道路在viewmodel里记录,不用 + */ + fun openRoadNameFragment() { + if (viewModel.liveDataRoadName.value != null) { + viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 78e29e3f..b456f1b1 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -31,6 +31,7 @@ import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig +import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.ui.dialog.CommonDialog @@ -76,6 +77,14 @@ class MainViewModel @Inject constructor( //顶部看板数据 val liveDataTopSignList = MutableLiveData>() + //道路名 + val liveDataRoadName = MutableLiveData() + + /** + * 当前选中的要展示的详细信息的要素 + */ + val liveDataSignMoreInfo = MutableLiveData() + // var testPoint = GeoPoint(0, 0) //uuid标识,用于记录轨迹组 @@ -93,6 +102,7 @@ class MainViewModel @Inject constructor( var menuState: Boolean = false + val liveDataMenuState = MutableLiveData() val liveDataCenterPoint = MutableLiveData() @@ -107,8 +117,8 @@ class MainViewModel @Inject constructor( init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { - Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> - liveDataCenterPoint.value = mapPosition + Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value = + mapPosition } }) @@ -213,6 +223,7 @@ class MainViewModel @Inject constructor( val linkList = realmOperateHelper.queryLink( point = point, ) + var hisRoadName = false if (linkList.isNotEmpty()) { //看板数据 val signList = mutableListOf() @@ -225,11 +236,17 @@ class MainViewModel @Inject constructor( if (linkIdCache != linkId) { - Log.e("jingo", "捕捉到的linkid $linkId ${link.geometry}") mapController.lineHandler.showLine(link.geometry) linkId?.let { var elementList = realmOperateHelper.queryLinkByLinkPid(it) for (element in elementList) { + + if (element.code == 2011) { + hisRoadName = true + liveDataRoadName.postValue(element) + continue + } + val distance = GeometryTools.distanceToDouble( point, GeometryTools.createGeoPoint(element.geometry) ) @@ -238,20 +255,20 @@ class MainViewModel @Inject constructor( iconId = SignUtil.getSignIcon(element), iconText = SignUtil.getSignIconText(element), distance = distance.toInt(), - elementId = element.id, linkId = linkId, - geometry = element.geometry, name = SignUtil.getSignNameText(element), bottomRightText = SignUtil.getSignBottomRightText(element), - elementCode = element.code, - moreText = SignUtil.getMoreInfoText(element) + renderEntity = element, + isMoreInfo = SignUtil.isMoreInfo(element), + index = SignUtil.getRoadInfoIndex(element) ) - + Log.e("jingo", "捕捉到的数据code ${element.code}") when (element.code) { - 2002, 2008, 2010, 2041 -> topSignList.add( + //车道数,种别,功能等级,线限速,道路方向 + 2041, 2008, 2002, 2019, 2010 -> topSignList.add( signBean ) - 4002, 4003, 4004, 4022 -> signList.add( + 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( signBean ) } @@ -260,33 +277,27 @@ class MainViewModel @Inject constructor( val realm = Realm.getDefaultInstance() val entity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RESTRICTION") - .and() - .equalTo( - "properties['linkIn']", - it + .equalTo("table", "OMDB_RESTRICTION").and().equalTo( + "properties['linkIn']", it ).findFirst() if (entity != null) { val outLink = entity.properties["linkOut"] val linkOutEntity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RD_LINK") - .and() - .equalTo( + .equalTo("table", "OMDB_RD_LINK").and().equalTo( "properties['${RenderEntity.Companion.LinkTable.linkPid}']", outLink ).findFirst() if (linkOutEntity != null) { mapController.lineHandler.linksLayer.addLine( - linkOutEntity.geometry, - 0x7DFF0000 + linkOutEntity.geometry, 0x7DFF0000 ) - Log.e("jingo", "捕捉到的linkid $outLink ${linkOutEntity.geometry}") } } } - liveDataTopSignList.postValue(topSignList.distinctBy { it.elementCode }) - liveDataSignList.postValue(signList.distinctBy { it.elementCode }) + liveDataTopSignList.postValue(topSignList.distinctBy { it.name }.sortedBy { it.index }) + + liveDataSignList.postValue(signList.sortedBy { it.distance }) val speechText = SignUtil.getRoadSpeechText(topSignList) withContext(Dispatchers.Main) { speakMode?.speakText(speechText) @@ -297,6 +308,10 @@ class MainViewModel @Inject constructor( mapController.lineHandler.removeLine() linkIdCache = "" } + //如果没有捕捉到道路名 + if (!hisRoadName) { + liveDataRoadName.postValue(null) + } } } @@ -488,8 +503,19 @@ class MainViewModel @Inject constructor( } } + /** + * 是否开启了线选择 + */ fun isSelectRoad(): Boolean { return bSelectRoad } + /** + * 要展示的要素详细信息 + */ + + fun showSignMoreInfo(data: RenderEntity) { + liveDataSignMoreInfo.value = data + } + } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt index 3bb31f38..5ba63474 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt @@ -1,63 +1,137 @@ package com.navinfo.omqs.ui.activity.map +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView import com.navinfo.omqs.R import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.databinding.AdapterSignBinding +import com.navinfo.omqs.databinding.AdapterSignLaneinfoBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder +import com.navinfo.omqs.ui.widget.SignUtil interface OnSignAdapterClickListener { fun onItemClick(signBean: SignBean) fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) fun onErrorClick(signBean: SignBean) - fun onHideMoreInfoView() } +data class LaneInfoItem(val id: Int, val type: Int) + class SignAdapter(private var listener: OnSignAdapterClickListener?) : BaseRecyclerViewAdapter() { /** * 选中的详细信息按钮的tag标签 */ private var selectMoreInfoTag: String = "" - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_sign + + override fun getItemViewType(position: Int): Int { + if (data.isNotEmpty() && data[position].renderEntity.code == 4601) { + return 4601 + } + return 0 } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { - val viewBinding = - AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return BaseViewHolder(viewBinding) + return if (viewType == 4601) { + val viewBinding = + AdapterSignLaneinfoBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + BaseViewHolder(viewBinding) + } else { + val viewBinding = + AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false) + BaseViewHolder(viewBinding) + } } override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { - val bd = holder.viewBinding as AdapterSignBinding - + val context = holder.viewBinding.root.context val item = data[position] - if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId) - bd.signMainIcon.text = item.iconText - bd.signBottomText.text = item.name - holder.tag = item.name + position - //点击错误按钮 - bd.signMainFastError.setOnClickListener { - listener?.onErrorClick(item) - } - bd.signBottomRightText.text = item.bottomRightText + if (holder.viewBinding is AdapterSignBinding) { + val bd = holder.viewBinding - bd.root.setOnClickListener { - listener?.onItemClick(item) - } - if (item.moreText.isNotEmpty()) { - bd.signMainInfo.visibility = View.VISIBLE - //点击更多信息按钮 - bd.signMainInfo.setOnClickListener { - listener?.onMoreInfoClick(selectMoreInfoTag, holder.tag, item) - selectMoreInfoTag = holder.tag + if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId) + bd.signMainIcon.text = item.iconText + bd.signBottomText.text = item.name + //点击错误按钮 + bd.signMainFastError.setOnClickListener { + listener?.onErrorClick(item) } - } else bd.signMainInfo.visibility = View.GONE + bd.signBottomRightText.text = item.bottomRightText + if (item.isMoreInfo) { + bd.signMainInfo.visibility = View.VISIBLE + bd.signMainInfo.setOnClickListener { + listener?.onMoreInfoClick(selectMoreInfoTag, holder.tag, item) + selectMoreInfoTag = holder.tag + } + } else { + bd.signMainInfo.visibility = View.GONE + } + bd.signSecondIcon.text = "" + if (item.renderEntity.code == 4002) { + val minSpeed = SignUtil.getSpeedLimitMinText(item.renderEntity) + if (minSpeed != "0") { + bd.signSecondIcon.text = minSpeed + } + } + bd.signMainBg.setOnClickListener { + listener?.onItemClick(item) + } + } else if (holder.viewBinding is AdapterSignLaneinfoBinding) { + val bd = holder.viewBinding + bd.signMoreIconsLayout.removeAllViews() + bd.signBottomText.text = item.name + bd.signBottomRightText.text = item.distance.toString() + val list = SignUtil.getLineInfoIcons(item.renderEntity) + val lineViewS = View(context) + lineViewS.layoutParams = ViewGroup.LayoutParams(24, 80) + lineViewS.background = context.getDrawable(R.drawable.shape_vertical_dashed_line) + bd.signMoreIconsLayout.addView(lineViewS, lineViewS.layoutParams) + for (i in list.indices) { + val laneInfo = list[i] + val imageView = ImageView(context) + val drawable = context.getDrawable(laneInfo.id) + var color = when (laneInfo.type) { + 1 -> bd.root.resources.getColor(R.color.lane_info_1) + 2 -> bd.root.resources.getColor(R.color.lane_info_2) + else -> bd.root.resources.getColor(R.color.white) + } + // 创建 PorterDuffColorFilter 对象 + val colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN) + // 将 PorterDuffColorFilter 设置给 Drawable + drawable!!.colorFilter = colorFilter + // 将 Drawable 设置给 ImageView + imageView.background = drawable + // 将 ImageView 的颜色设置为红色 + imageView.setColorFilter(color, PorterDuff.Mode.SRC_IN) + imageView.layoutParams = ViewGroup.LayoutParams(35, 100) + bd.signMoreIconsLayout.addView(imageView, imageView.layoutParams) + if (i < list.size - 1) { + val lineView = View(context) + lineView.layoutParams = ViewGroup.LayoutParams(24, 80) + lineView.background = context.getDrawable(R.drawable.shape_vertical_dashed_line) + bd.signMoreIconsLayout.addView(lineView, lineView.layoutParams) + } + } + val lineViewE = View(context) + lineViewE.layoutParams = ViewGroup.LayoutParams(24, 80) + lineViewE.background = context.getDrawable(R.drawable.shape_vertical_dashed_line) + bd.signMoreIconsLayout.addView(lineViewE, lineViewE.layoutParams) + bd.root.setOnClickListener { + listener?.onItemClick(item) + } + } + holder.tag = item.name + position } override fun refreshData(newData: List) { @@ -67,7 +141,6 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) : return } } - listener?.onHideMoreInfoView() } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt index 0ed1ba72..1e01ed5d 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt @@ -11,9 +11,6 @@ import com.navinfo.omqs.ui.other.BaseViewHolder class TopSignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = null) : BaseRecyclerViewAdapter() { - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_top_sign - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt new file mode 100644 index 00000000..36921971 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt @@ -0,0 +1,256 @@ +package com.navinfo.omqs.ui.activity.scan + +import android.content.Context +import android.text.TextUtils +import android.widget.Toast +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.navinfo.omqs.Constant +import com.navinfo.omqs.bean.IndoorConnectionInfoBean +import com.navinfo.omqs.bean.QRCodeBean +import com.navinfo.omqs.bean.SysUserBean +import com.navinfo.omqs.http.DefaultResponse +import com.navinfo.omqs.http.NetResult +import com.navinfo.omqs.http.NetworkService +import com.navinfo.omqs.ui.activity.login.LoginStatus +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.IOException +import javax.inject.Inject + +enum class QrCodeStatus { + /** + * 网络访问失败 + */ + QR_CODE_STATUS_NET_FAILURE, + + /** + * 成功 + */ + QR_CODE_STATUS_SUCCESS, + + /** + * 信息更新成功 + */ + QR_CODE_STATUS_SERVER_INFO_SUCCESS, +} + +@HiltViewModel +class QrCodeViewModel @Inject constructor( + private val networkService: NetworkService +) : ViewModel() { + //用户信息 + val qrCodeBean: MutableLiveData = MutableLiveData() + + //是不是连接成功 + val qrCodeStatus: MutableLiveData = MutableLiveData() + + + init { + qrCodeBean.value = QRCodeBean() + } + + + /** + * 扫一扫按钮 + */ + fun connect(context: Context, ips: String) { + + if (TextUtils.isEmpty(ips)) { + Toast.makeText(context, "获取ip失败!", Toast.LENGTH_LONG).show() + return + } + + val ipArray = ips.split(";".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + //测试代码 + //final String[] ipArray = new String[]{"172.21.2.137"}; + if (ipArray.isEmpty()) { + Toast.makeText(context, "获取ip失败!", Toast.LENGTH_SHORT).show() + return + } + + ipArray.forEach { ip -> + if (!TextUtils.isEmpty(ip)) { + viewModelScope.launch(Dispatchers.Default) { + val ipTemp: String = ip + val url = "http://$ipTemp:8080/sensor/service/keepalive" + when (val result = networkService.connectIndoorTools(url)) { + is NetResult.Success<*> -> { + + if (result.data != null) { + try { + + val defaultUserResponse = result.data as QRCodeBean + + if (defaultUserResponse.errcode == 0) { + + Constant.INDOOR_IP = ipTemp + + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_SUCCESS) + + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "连接室内整理工具成功。", + Toast.LENGTH_LONG + ).show() + } + } else { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${defaultUserResponse.msg}", + Toast.LENGTH_SHORT + ) + .show() + } + } + + } catch (e: IOException) { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${e.message}", + Toast.LENGTH_SHORT + ).show() + } + } + } + } + + is NetResult.Error<*> -> { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${result.exception.message}", + Toast.LENGTH_SHORT + ) + .show() + } + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + } + + is NetResult.Failure<*> -> { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${result.code}:${result.msg}", + Toast.LENGTH_SHORT + ) + .show() + } + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + } + + else -> {} + } + } + } + } + } + + /** + * 扫一扫按钮 + */ + fun updateServerInfo(context: Context) { + + if (TextUtils.isEmpty(Constant.INDOOR_IP)) { + Toast.makeText(context, "获取ip失败!", Toast.LENGTH_LONG).show() + return + } + + viewModelScope.launch(Dispatchers.Default) { + val url = "http://${Constant.INDOOR_IP}:8080/sensor/service/connection" + when (val result = networkService.updateServerInfo( + url = url, + indoorConnectionInfoBean = IndoorConnectionInfoBean( + Constant.USER_ID, + Constant.USER_ID, + Constant.USER_ID, + Constant.USER_ID, + com.navinfo.collect.library.system.Constant.SERVER_ADDRESS, + Constant.USER_ID, + "Android" + ) + )) { + is NetResult.Success<*> -> { + + if (result.data != null) { + try { + + val defaultUserResponse = result.data as QRCodeBean + + if (defaultUserResponse.errcode == 0) { + + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "信息更新成功。", + Toast.LENGTH_LONG + ).show() + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_SERVER_INFO_SUCCESS) + } + } else { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${defaultUserResponse.msg}", + Toast.LENGTH_SHORT + ) + .show() + } + } + + } catch (e: IOException) { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${e.message}", + Toast.LENGTH_SHORT + ).show() + } + } + } + } + + is NetResult.Error<*> -> { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${result.exception.message}", + Toast.LENGTH_SHORT + ) + .show() + } + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + } + + is NetResult.Failure<*> -> { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${result.code}:${result.msg}", + Toast.LENGTH_SHORT + ) + .show() + } + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + } + + else -> {} + } + + } + + } + + + override fun onCleared() { + super.onCleared() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt new file mode 100644 index 00000000..12706f25 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt @@ -0,0 +1,147 @@ +package com.navinfo.omqs.ui.activity.scan + +import android.annotation.SuppressLint +import android.graphics.Rect +import android.graphics.RectF +import android.os.Bundle +import android.util.Log +import androidx.activity.viewModels +import androidx.camera.core.ImageCapture +import androidx.camera.view.LifecycleCameraController +import androidx.databinding.DataBindingUtil +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.ActivityQrCodeBinding +import com.navinfo.omqs.ui.activity.BaseActivity +import com.navinfo.omqs.ui.listener.QRCodeAnalyser +import dagger.hilt.android.AndroidEntryPoint +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import androidx.lifecycle.Observer +import com.navinfo.omqs.ui.activity.login.LoginStatus + +/** + * date:2023/6/18 + * author:qj + * description:二维码扫描 + */ +@AndroidEntryPoint +class QrCodeActivity : BaseActivity() { + private lateinit var binding: ActivityQrCodeBinding + private lateinit var lifecycleCameraController: LifecycleCameraController + private lateinit var cameraExecutor: ExecutorService + private val viewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = DataBindingUtil.setContentView(this, R.layout.activity_qr_code) + + binding.qrCodeModel = viewModel + binding.lifecycleOwner = this + binding.activity = this + + initView() + initController() + } + + private fun initView() { + //登录校验,初始化成功 + viewModel.qrCodeStatus.observe(this, qrCodeObserve) + } + + /* + * 监听扫描结果 + * */ + private val qrCodeObserve = Observer { + when (it) { + QrCodeStatus.QR_CODE_STATUS_SUCCESS -> { + finish() + } + QrCodeStatus.QR_CODE_STATUS_NET_FAILURE -> { + + } + QrCodeStatus.QR_CODE_STATUS_SERVER_INFO_SUCCESS -> { + + } + } + } + + @SuppressLint("ClickableViewAccessibility", "UnsafeOptInUsageError") + private fun initController() { + cameraExecutor = Executors.newSingleThreadExecutor() + lifecycleCameraController = LifecycleCameraController(this) + lifecycleCameraController.bindToLifecycle(this) + lifecycleCameraController.imageCaptureFlashMode = ImageCapture.FLASH_MODE_AUTO + lifecycleCameraController.setImageAnalysisAnalyzer( + cameraExecutor, + QRCodeAnalyser { barcodes, imageWidth, imageHeight -> + if (barcodes.isEmpty()) { + return@QRCodeAnalyser + } + initScale(imageWidth, imageHeight) + val list = ArrayList() + val strList = ArrayList() + + barcodes.forEach { barcode -> + barcode.boundingBox?.let { rect -> + val translateRect = translateRect(rect) + list.add(translateRect) + Log.e( + "ztzt", "left:${translateRect.left} +" + + " top:${translateRect.top} + right:${translateRect.right}" + + " + bottom:${translateRect.bottom}" + ) + Log.e("ztzt", "barcode.rawValue:${barcode.rawValue}") + strList.add(barcode.rawValue ?: "No Value") + } + } + judgeIntent(strList) + binding.scanView.setRectList(list) + + }) + binding.previewView.controller = lifecycleCameraController + } + + fun judgeIntent(list: ArrayList) { + val sb = StringBuilder() + list.forEach { + sb.append(it) + sb.append("\n") + } + intentToResult(sb.toString()) + } + + private fun intentToResult(result: String) { + + Log.e("qj", "QRCodeActivity === $result") + + viewModel.connect(this, result) + + /* val intent = Intent(this, QRCodeResultActivity::class.java) + intent.putExtra(QRCodeResultActivity.RESULT_KEY, result) + startActivity(intent) + finish()*/ + } + + + private var scaleX = 0f + private var scaleY = 0f + + private fun translateX(x: Float): Float = x * scaleX + private fun translateY(y: Float): Float = y * scaleY + + //将扫描的矩形换算为当前屏幕大小 + private fun translateRect(rect: Rect) = RectF( + translateX(rect.left.toFloat()), + translateY(rect.top.toFloat()), + translateX(rect.right.toFloat()), + translateY(rect.bottom.toFloat()) + ) + + //初始化缩放比例 + private fun initScale(imageWidth: Int, imageHeight: Int) { + Log.e("ztzt", "imageWidth:${imageWidth} + imageHeight:${imageHeight}") + scaleY = binding.scanView.height.toFloat() / imageWidth.toFloat() + scaleX = binding.scanView.width.toFloat() / imageHeight.toFloat() + Log.e("ztzt", "scaleX:${scaleX} + scaleY:${scaleY}") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeResultActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeResultActivity.kt new file mode 100644 index 00000000..de4c3c93 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeResultActivity.kt @@ -0,0 +1,30 @@ +package com.navinfo.omqs.ui.activity.scan + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.navinfo.omqs.databinding.ActivityResultBinding + +/** + * date:2021/6/18 + * author:zhangteng + * description: + */ +class QRCodeResultActivity : AppCompatActivity() { + private lateinit var binding: ActivityResultBinding + + companion object { + const val RESULT_KEY = "result_key"; + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityResultBinding.inflate(layoutInflater) + setContentView(binding.root) + + val intent = intent + binding.text.text = intent.getStringExtra(RESULT_KEY) + binding.button.setOnClickListener { + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt index a0882082..93395a0b 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt @@ -1,13 +1,8 @@ package com.navinfo.omqs.ui.fragment import android.os.Bundle -import android.view.KeyEvent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController abstract class BaseFragment : Fragment() { // override fun onCreateView( @@ -49,8 +44,8 @@ abstract class BaseFragment : Fragment() { // savedInstanceState: Bundle? // ): View - fun onBackPressed(): Boolean{ - findNavController().navigateUp() + open fun onBackPressed(): Boolean{ +// findNavController().navigateUp() return true } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt index 87cf037d..54af711c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt @@ -1,6 +1,5 @@ package com.navinfo.omqs.ui.fragment.evaluationresult -import android.app.Dialog import android.os.Build import android.os.Bundle import android.util.Log @@ -8,19 +7,22 @@ import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup -import androidx.annotation.RequiresApi import androidx.databinding.DataBindingUtil import androidx.navigation.NavOptions +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.databinding.FragmentEvaluationResultBinding +import com.navinfo.omqs.ui.dialog.FirstDialog import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint -import androidx.navigation.findNavController -import com.navinfo.omqs.ui.dialog.FirstDialog +import org.videolan.vlc.Util + @AndroidEntryPoint class EvaluationResultFragment : BaseFragment(), View.OnClickListener { @@ -31,6 +33,10 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { */ private val viewModel by shareViewModels("QsRecode") + private val pictureAdapter by lazy { + PictureAdapter() + } + // private val args:EmptyFragmentArgs by navArgs() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -56,6 +62,8 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { adapter.refreshData(it) } + binding.evaluationPictureViewpager + return binding.root } @@ -70,12 +78,12 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { val mDialog = FirstDialog(context) mDialog.setTitle("提示?") mDialog.setMessage("是否退出,请确认!") - mDialog.setPositiveButton("确定", object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - mDialog.dismiss() - onBackPressed() - } - }) + mDialog.setPositiveButton( + "确定" + ) { _, _ -> + mDialog.dismiss() + onBackPressed() + } mDialog.setNegativeButton("取消", null) mDialog.show() } @@ -91,6 +99,21 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { viewModel.deleteData(requireContext()) } + /** + * 照片view + */ + binding.evaluationPictureViewpager.adapter = pictureAdapter + val list = mutableListOf("1", "2", "3") + pictureAdapter.refreshData(list) + + binding.evaluationPictureLeft.setOnClickListener(this) + binding.evaluationPictureRight.setOnClickListener(this) + + + val recyclerView = binding.evaluationPictureViewpager.getChildAt(0) as RecyclerView + + recyclerView.setPadding(0, 0, Util.convertDpToPx(requireContext(), 50), 0) + recyclerView.clipToPadding = false binding.evaluationVoice.setOnTouchListener { _, event -> @@ -111,6 +134,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { true } + /** * 读取元数据 */ @@ -249,6 +273,24 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { override fun onClick(v: View?) { v?.let { when (v.id) { + //照片左侧按钮 + R.id.evaluation_picture_left -> { + val currentItem = binding.evaluationPictureViewpager.currentItem + if (currentItem > 0) { + binding.evaluationPictureViewpager.currentItem = currentItem - 1 + } else { + } + + } + //照片右侧按钮 + R.id.evaluation_picture_right -> { + val currentItem = binding.evaluationPictureViewpager.currentItem + if (currentItem < pictureAdapter.data.size - 1) { + binding.evaluationPictureViewpager.currentItem = currentItem + 1 + } else { + + } + } //上三项,打开面板 R.id.evaluation_class_type, R.id.evaluation_problem_type, R.id.evaluation_phenomenon -> { activity?.run { @@ -315,4 +357,9 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { } } + override fun onBackPressed(): Boolean { + findNavController().navigateUp() + return true + } + } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 301254cb..e5f47088 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -26,6 +26,7 @@ import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ChatMsgEntity +import com.navinfo.omqs.bean.ScProblemTypeBean import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RoomAppDatabase @@ -65,7 +66,7 @@ class EvaluationResultViewModel @Inject constructor( /** * 问题分类 liveData,给[LeftAdapter]展示的数据 */ - val liveDataLeftTypeList = MutableLiveData>() + val liveDataLeftTypeList = MutableLiveData>() /** * 问题类型 liveData 给[MiddleAdapter]展示的数据 @@ -95,6 +96,8 @@ class EvaluationResultViewModel @Inject constructor( var classTypeTemp: String = "" + var classCodeTemp: String = "" + init { liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString()) viewModelScope.launch { @@ -137,7 +140,7 @@ class EvaluationResultViewModel @Inject constructor( } } else { liveDataQsRecordBean.value?.run { - elementId = bean.elementId + elementId = bean.renderEntity.code.toString() linkId = bean.linkId if (linkId.isNotEmpty()) { viewModelScope.launch { @@ -149,7 +152,7 @@ class EvaluationResultViewModel @Inject constructor( } } } - val point = GeometryTools.createGeoPoint(bean.geometry) + val point = GeometryTools.createGeoPoint(bean.renderEntity.geometry) this.geometry = GeometryTools.createGeometry(point).toText() mapController.animationHandler.animationByLatLon(point.latitude, point.longitude) mapController.markerHandle.addMarker(point, markerTitle) @@ -194,22 +197,24 @@ class EvaluationResultViewModel @Inject constructor( list?.let { if (list.isNotEmpty()) { //通知页面更新 - var classType = list[0] + var classType = list[0].classType + var classCode = list[0].elementCode liveDataLeftTypeList.postValue(it) if (bean != null) { - val classType2 = roomAppDatabase.getScProblemTypeDao() - .findClassTypeByCode(bean.elementCode) + val classType2 = roomAppDatabase.getScProblemTypeDao().findClassTypeByCode(bean.renderEntity.code) if (classType2 != null) { classType = classType2 } } //如果右侧栏没数据,给个默认值 if (liveDataQsRecordBean.value!!.classType.isEmpty()) { - liveDataQsRecordBean.value!!.classType = classType + liveDataQsRecordBean.value!!.classCode = classCode classTypeTemp = classType + classCodeTemp = classCode } else { classType = liveDataQsRecordBean.value!!.classType + classCode = liveDataQsRecordBean.value!!.classCode } getProblemList(classType) } @@ -298,6 +303,7 @@ class EvaluationResultViewModel @Inject constructor( */ fun setPhenomenonMiddleBean(adapterBean: RightBean) { liveDataQsRecordBean.value!!.classType = classTypeTemp + liveDataQsRecordBean.value!!.classCode = classCodeTemp liveDataQsRecordBean.value!!.phenomenon = adapterBean.text liveDataQsRecordBean.value!!.problemType = adapterBean.title liveDataQsRecordBean.postValue(liveDataQsRecordBean.value) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt index c68b7e88..9668f889 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt @@ -5,17 +5,15 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.annotation.RequiresApi import com.navinfo.omqs.R +import com.navinfo.omqs.bean.ScProblemTypeBean import com.navinfo.omqs.databinding.TextItemSelectBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : - BaseRecyclerViewAdapter() { + BaseRecyclerViewAdapter() { private var selectTitle = "" - override fun getItemViewRes(position: Int): Int { - return R.layout.text_item_select - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = @@ -27,18 +25,18 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { val bd = holder.viewBinding as TextItemSelectBinding val title = data[position] - bd.itemId.text = title - holder.viewBinding.root.isSelected = selectTitle == title + bd.itemId.text = title.classType + holder.viewBinding.root.isSelected = selectTitle == title.classType bd.root.setOnClickListener { - if (selectTitle != title) { - selectTitle = title + if (selectTitle != title.classType) { + selectTitle = title.classType notifyDataSetChanged() } - itemListener?.invoke(position, title) + itemListener?.invoke(position, title.classType) } } - override fun refreshData(newData: List) { + override fun refreshData(newData: List) { data = newData notifyDataSetChanged() } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt index e2ce025f..ee0b6044 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt @@ -13,9 +13,6 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) BaseRecyclerViewAdapter() { private var selectTitle = "" - override fun getItemViewRes(position: Int): Int { - return R.layout.text_item_select - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PictureAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PictureAdapter.kt new file mode 100644 index 00000000..8b8f03b1 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PictureAdapter.kt @@ -0,0 +1,21 @@ +package com.navinfo.omqs.ui.fragment.evaluationresult + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.navinfo.omqs.databinding.AdapterPictureBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +class PictureAdapter : BaseRecyclerViewAdapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterPictureBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val bd = holder.viewBinding as AdapterPictureBinding + bd.button.text = data[position] + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt index d0dd4de4..2785a0df 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt @@ -11,9 +11,6 @@ class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Uni BaseRecyclerViewAdapter() { private var selectTitle = "" private var groupTitleList = mutableListOf() - override fun getItemViewRes(position: Int): Int { - return R.layout.text_item_select2 - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt index 31a323b0..164c9405 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt @@ -224,10 +224,6 @@ class SoundtListAdapter( } } - - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_sound_list - } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt index dede03ce..9bf60d86 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt @@ -131,10 +131,6 @@ class OfflineMapCityListAdapter( } } } - - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_offline_map_city - } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index c1383b38..2e1fbc8c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -1,13 +1,14 @@ package com.navinfo.omqs.ui.fragment.personalcenter +import android.Manifest import android.content.Intent import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.fragment.app.viewModels -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.blankj.utilcode.util.ToastUtils import com.blankj.utilcode.util.UriUtils @@ -21,6 +22,8 @@ import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.tools.CoroutineUtils import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.activity.scan.QrCodeActivity +import com.permissionx.guolindev.PermissionX import dagger.hilt.android.AndroidEntryPoint import org.oscim.core.GeoPoint import javax.inject.Inject @@ -123,6 +126,16 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : // R.id.personal_center_menu_layer_manager -> { // 图层管理 // findNavController().navigate(R.id.QsLayerManagerFragment) // } +/* R.id.personal_center_menu_qs_record_list -> { + findNavController().navigate(R.id.QsRecordListFragment) + } + R.id.personal_center_menu_layer_manager -> { // 图层管理 + findNavController().navigate(R.id.QsLayerManagerFragment) + }*/ + R.id.personal_center_menu_scan_qr_code -> { + //跳转二维码扫描界面 + checkPermission() + } } true } @@ -134,6 +147,11 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : fileChooser.setCallbacks(this@PersonalCenterFragment) } + private fun intentTOQRCode() { + var intent = Intent(context, QrCodeActivity::class.java); + startActivity(intent) + } + override fun onDestroyView() { super.onDestroyView() _binding = null @@ -147,4 +165,18 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : super.onActivityResult(requestCode, resultCode, data) fileChooser.onActivityResult(requestCode, resultCode, data) } + + private fun checkPermission() { + PermissionX.init(this) + .permissions(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO) + .request { allGranted, grantedList, deniedList -> + if (allGranted) { + //所有权限已经授权 + Toast.makeText(context,"授权成功",Toast.LENGTH_LONG).show() + intentTOQRCode() + } else { + Toast.makeText(context, "拒绝权限: $deniedList", Toast.LENGTH_LONG).show() + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt index 3e9f3f0d..070a4cf3 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt @@ -58,9 +58,6 @@ class QsRecordListAdapter( binding.qsRecordTime.text = qsRecordBean.checkTime } - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_qs_record_list - } // 提供set方法 fun setOnKotlinItemClickListener(itemClickListener: IKotlinItemClickListener) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt new file mode 100644 index 00000000..50a95962 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt @@ -0,0 +1,30 @@ +package com.navinfo.omqs.ui.fragment.signMoreInfo + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +data class ElectronicEyeMoreInfoAdapterItem( + val title: String, + val text: String +) + +class ElectronicEyeInfoAdapter : BaseRecyclerViewAdapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterElectronicEyeBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val binding: AdapterElectronicEyeBinding = + holder.viewBinding as AdapterElectronicEyeBinding + val item = data[position] + binding.title.text = item.title + binding.text.text = item.text + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt new file mode 100644 index 00000000..d768f4db --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt @@ -0,0 +1,27 @@ +package com.navinfo.omqs.ui.fragment.signMoreInfo + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.navinfo.omqs.R +import com.navinfo.omqs.bean.RoadNameBean +import com.navinfo.omqs.databinding.AdapterRoadNameBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +class RoadNameInfoAdapter : BaseRecyclerViewAdapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterRoadNameBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val binding: AdapterRoadNameBinding = + holder.viewBinding as AdapterRoadNameBinding + val bean = data[position] + binding.title.text = bean.getNameClassStr() + binding.name.text = bean.name + binding.type.text = bean.getTypeStr() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt new file mode 100644 index 00000000..471f39fb --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt @@ -0,0 +1,100 @@ +package com.navinfo.omqs.ui.fragment.signMoreInfo + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.LinearLayoutManager +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.FragmentSignInfoBinding +import com.navinfo.omqs.ui.activity.map.MainViewModel +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.widget.SignUtil + + +class SignMoreInfoFragment : BaseFragment() { + private var _binding: FragmentSignInfoBinding? = null + private val binding get() = _binding!! + + private val viewModel by activityViewModels() + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentSignInfoBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val layoutManager = LinearLayoutManager(context) + //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能 + binding.signInfoRecyclerview.setHasFixedSize(true) + binding.signInfoRecyclerview.layoutManager = layoutManager + viewModel.liveDataSignMoreInfo.observe(viewLifecycleOwner) { + binding.signInfoTitle.text = it.name + val drawable = resources.getDrawable(R.drawable.icon_main_moreinfo_text_left, null); + drawable.setBounds( + 0, + 0, + drawable.minimumWidth, + drawable.minimumHeight + );//必须设置图片大小,否则不显示 + binding.signInfoTitle.setCompoundDrawables( + drawable, null, null, null + ) + + when (it.code) { + //道路名 + 2011 -> { + val adapter = RoadNameInfoAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getRoadNameList(it)) + } + //常规点限速 + 4002->{ + val adapter = ElectronicEyeInfoAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getSpeedLimitMoreInfoText(it)) + } + //条件点限速 + 4003 -> { + val adapter = ElectronicEyeInfoAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getConditionLimitMoreInfoText(it)) + } + //电子眼 + 4010 + -> { + val drawable = resources.getDrawable(R.drawable.icon_electronic_eye_left, null); + drawable.setBounds( + 0, + 0, + drawable.minimumWidth, + drawable.minimumHeight + );//必须设置图片大小,否则不显示 + binding.signInfoTitle.setCompoundDrawables( + drawable, null, null, null + ) + val adapter = ElectronicEyeInfoAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getElectronicEyeMoreInfo(it)) + } + + } + } + + binding.signInfoCancel.setOnClickListener { + activity?.run { + supportFragmentManager.beginTransaction().remove(this@SignMoreInfoFragment) + .commit() + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt index 86503718..ee7ec323 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt @@ -58,9 +58,6 @@ class TaskAdapter( } } - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_task - } fun resetSelect() { selectPosition = -1 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index 0b963619..b1dbfd5c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -282,10 +282,6 @@ class TaskListAdapter( } } } - - override fun getItemViewRes(position: Int): Int { - return R.layout.adapter_task_list - } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt index ec11bd80..63285395 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt @@ -15,7 +15,8 @@ import dagger.hilt.android.AndroidEntryPoint * 评测任务viewpager管理页面 */ @AndroidEntryPoint -class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Unit?)? = null) : BaseFragment() { +class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Unit?)? = null) : + BaseFragment() { private var _binding: FragmentTaskManagerBinding? = null private val binding get() = _binding!! diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 3bf42632..e3c4e290 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -4,6 +4,7 @@ import android.content.Context import android.graphics.Color import android.os.Build import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -95,18 +96,21 @@ class TaskViewModel @Inject constructor( } } } + is NetResult.Error<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT) .show() } } + is NetResult.Failure<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT) .show() } } + is NetResult.Loading -> {} } val realm = Realm.getDefaultInstance() @@ -139,41 +143,42 @@ class TaskViewModel @Inject constructor( /** * 设置当前选择的任务,并高亮当前任务的所有link */ + @RequiresApi(Build.VERSION_CODES.M) fun setSelectTaskBean(taskBean: TaskBean) { currentSelectTaskBean = taskBean + liveDataTaskLinks.value = taskBean.hadLinkDvoList - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - mapController.lineHandler.omdbTaskLinkLayer.removeAll() - if(taskBean.hadLinkDvoList.isNotEmpty()){ - mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) - var maxX = 0.0 - var maxY = 0.0 - var minX = 0.0 - var minY = 0.0 - for (item in taskBean.hadLinkDvoList) { - val geometry = GeometryTools.createGeometry(item.geometry) - if(geometry!=null){ - val envelope = geometry.envelopeInternal - if (envelope.maxX > maxX) { - maxX = envelope.maxX - } - if (envelope.maxY > maxY) { - maxY = envelope.maxY - } - if (envelope.minX < minX || minX == 0.0) { - minX = envelope.minX - } - if (envelope.minY < minY || minY == 0.0) { - minY = envelope.minY - } + + mapController.lineHandler.omdbTaskLinkLayer.removeAll() + if (taskBean.hadLinkDvoList.isNotEmpty()) { + mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) + var maxX = 0.0 + var maxY = 0.0 + var minX = 0.0 + var minY = 0.0 + for (item in taskBean.hadLinkDvoList) { + val geometry = GeometryTools.createGeometry(item.geometry) + if (geometry != null) { + val envelope = geometry.envelopeInternal + if (envelope.maxX > maxX) { + maxX = envelope.maxX + } + if (envelope.maxY > maxY) { + maxY = envelope.maxY + } + if (envelope.minX < minX || minX == 0.0) { + minX = envelope.minX + } + if (envelope.minY < minY || minY == 0.0) { + minY = envelope.minY } } - //增加异常数据判断 - if(maxX!=0.0&&maxY!=0.0&&minX!=0.0&&minY!=0.0){ - mapController.animationHandler.animateToBox( - maxX = maxX, maxY = maxY, minX = minX, minY = minY - ) - } + } + //增加异常数据判断 + if (maxX != 0.0 && maxY != 0.0 && minX != 0.0 && minY != 0.0) { + mapController.animationHandler.animateToBox( + maxX = maxX, maxY = maxY, minX = minX, minY = minY + ) } } } @@ -181,20 +186,20 @@ class TaskViewModel @Inject constructor( /** * 高亮当前选中的link */ + @RequiresApi(Build.VERSION_CODES.M) fun showCurrentLink(link: HadLinkDvoBean) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - mapController.lineHandler.omdbTaskLinkLayer.showSelectLine(link) - val geometry = GeometryTools.createGeometry(link.geometry) - if(geometry!=null){ - val envelope = geometry.envelopeInternal - mapController.animationHandler.animateToBox( - maxX = envelope.maxX, - maxY = envelope.maxY, - minX = envelope.minX, - minY = envelope.minY - ) - } + mapController.lineHandler.omdbTaskLinkLayer.showSelectLine(link) + val geometry = GeometryTools.createGeometry(link.geometry) + if (geometry != null) { + val envelope = geometry.envelopeInternal + mapController.animationHandler.animateToBox( + maxX = envelope.maxX, + maxY = envelope.maxY, + minX = envelope.minX, + minY = envelope.minY + ) } + } override fun onCleared() { diff --git a/app/src/main/java/com/navinfo/omqs/ui/listener/QrCodeAnalyzer.kt b/app/src/main/java/com/navinfo/omqs/ui/listener/QrCodeAnalyzer.kt new file mode 100644 index 00000000..c7216cfa --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/listener/QrCodeAnalyzer.kt @@ -0,0 +1,43 @@ +package com.navinfo.omqs.ui.listener + +import android.annotation.SuppressLint +import android.util.Log +import androidx.camera.core.ImageAnalysis +import androidx.camera.core.ImageProxy +import com.google.mlkit.vision.barcode.Barcode +import com.google.mlkit.vision.barcode.BarcodeScannerOptions +import com.google.mlkit.vision.barcode.BarcodeScanning +import com.google.mlkit.vision.common.InputImage + +class QRCodeAnalyser(private val listener: (List, Int, Int) -> Unit) : + ImageAnalysis.Analyzer { + //配置当前扫码格式 + private val options = BarcodeScannerOptions.Builder() + .setBarcodeFormats( + Barcode.FORMAT_QR_CODE, + Barcode.FORMAT_AZTEC + ).build() + + //获取解析器 + private val detector = BarcodeScanning.getClient(options) + + @SuppressLint("UnsafeExperimentalUsageError", "UnsafeOptInUsageError") + override fun analyze(imageProxy: ImageProxy) { + val mediaImage = imageProxy.image ?: kotlin.run { + imageProxy.close() + return + } + val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees) + detector.process(image) + .addOnSuccessListener { barCodes -> + Log.e("ztzt", "barCodes: ${barCodes.size}") + if (barCodes.size > 0) { + listener.invoke(barCodes, imageProxy.width, imageProxy.height) + //接收到结果后,就关闭解析 + detector.close() + } + } + .addOnFailureListener { Log.e("ztzt", "Error: ${it.message}") } + .addOnCompleteListener { imageProxy.close() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt index aa93a6d2..dcb22ba9 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt @@ -1,11 +1,6 @@ package com.navinfo.omqs.ui.other -import android.view.LayoutInflater -import android.view.View.OnClickListener -import android.view.ViewGroup -import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView -import com.navinfo.omqs.R /** * RecyclerView 适配器基础类 @@ -27,10 +22,10 @@ abstract class BaseRecyclerViewAdapter(var data: List = listOf()) : // ) // } - abstract fun getItemViewRes(position: Int): Int - - override fun getItemViewType(position: Int): Int { - return getItemViewRes(position) + // abstract fun getItemViewRes(position: Int): Int +// + open override fun getItemViewType(position: Int): Int { + return 0 } override fun getItemCount(): Int { diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt b/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt new file mode 100644 index 00000000..dbcb22d9 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt @@ -0,0 +1,54 @@ +//package com.navinfo.omqs.ui.other +// +//import androidx.lifecycle.* +// +//val vMStoreMap = HashMap() +// +//inline fun LifecycleOwner.shareViewModels( +// scopeName: String, +// factory: ViewModelProvider.Factory? = null +//): Lazy { +// val store: VMStoreClass +// if (vMStoreMap.keys.contains(scopeName)) { +// store = vMStoreMap[scopeName]!! +// } else { +// store = VMStoreClass() +// vMStoreMap[scopeName] = store +// } +// store.register(this) +// return ViewModelLazy(VM::class, +// { store.viewModelStore }, +// { factory ?: ViewModelProvider.NewInstanceFactory() }) +//} +// +//class VMStoreClass : ViewModelStoreOwner { +// +// private val bindTargets = ArrayList() +// private var vmStore: ViewModelStore? = null +// +// fun register(host: LifecycleOwner) { +// if (!bindTargets.contains(host)) { +// bindTargets.add(host) +// host.lifecycle.addObserver(object : LifecycleEventObserver { +// override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { +// if (event == Lifecycle.Event.ON_DESTROY) { +// host.lifecycle.removeObserver(this) +// bindTargets.remove(host) +// if (bindTargets.isEmpty()) {//如果当前商店没有关联对象,则释放资源 +// vMStoreMap.entries.find { it.value == this@VMStoreClass }?.also { +// vmStore?.clear() +// vMStoreMap.remove(it.key) +// } +// } +// } +// } +// }) +// } +// } +// +// override fun getViewModelStore(): ViewModelStore { +// if (vmStore == null) +// vmStore = ViewModelStore() +// return vmStore!! +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/ScanView.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/ScanView.kt new file mode 100644 index 00000000..bfc487a7 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/widget/ScanView.kt @@ -0,0 +1,88 @@ +package com.navinfo.omqs.ui.widget + +import android.animation.ObjectAnimator +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.view.View +import androidx.core.content.ContextCompat +import com.navinfo.omqs.R + +/** + * Author:zhangteng + * description: + * date:2021/6/19 + */ +class ScanView(context: Context, attrs: AttributeSet) : View(context, attrs) { + private val circlePaint = Paint() //二维码圆圈画笔 + private var rectList: ArrayList? = null //二维码数组 + private var scanLine: Bitmap//横线 + private var isShowLine = true//是否显示扫描线 + private var animator: ObjectAnimator? = null + private var floatYFraction = 0f + set(value) { + field = value + invalidate() + } + + init { + circlePaint.apply { + this.style = Paint.Style.FILL + this.color = ContextCompat.getColor( + context, android.R.color.holo_green_dark + ) + } + + scanLine = BitmapFactory.decodeResource(resources, R.drawable.scan_light) + getAnimator().start() + } + + override fun onDraw(canvas: Canvas?) { + super.onDraw(canvas) + parseResult(canvas) + if (isShowLine) { + canvas?.drawBitmap(scanLine, (width - scanLine.width) / 2f, height * floatYFraction, circlePaint) + } + } + + private fun getAnimator(): ObjectAnimator { + if (animator == null) { + animator = ObjectAnimator.ofFloat( + this, + "floatYFraction", + 0f, + 1f + ) + animator?.duration = 5000 + animator?.repeatCount = -1 //-1代表无限循环 + } + return animator!! + } + + private fun parseResult(canvas: Canvas?) { + rectList?.let { list -> + if (list.isEmpty()) { + return + } + list.forEach { + canvas?.drawCircle( + it.left + (it.right - it.left) / 2f, + it.top + (it.bottom - it.top) / 2f, + 50f, + circlePaint + ) + } + } + } + + fun setRectList(list: ArrayList?) { + rectList = list + rectList?.let { + if (it.isNotEmpty()) { + isShowLine = false + getAnimator().cancel() + invalidate() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt index 773e55e0..fcfe77a1 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt @@ -3,7 +3,12 @@ package com.navinfo.omqs.ui.widget import android.util.Log import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.R +import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.SignBean +import com.navinfo.omqs.ui.activity.map.LaneInfoItem +import com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeMoreInfoAdapterItem +import org.json.JSONArray +import java.lang.reflect.Field class SignUtil { companion object { @@ -19,14 +24,23 @@ class SignUtil { 2008 -> getKindText(data) //道路方向 2010 -> getRoadDirectionText(data) + //常规线限速 + 2019 -> getLineSpeedLimitText(data) //车道数 2041 -> getLaneNumText(data) //常规点限速,条件点限速 - 4002, 4003 -> getSpeedLimitText(data) + 4002, 4003 -> getSpeedLimitMaxText(data) else -> "" } } + /** + * 常规线限速值 + */ + private fun getLineSpeedLimitText(data: RenderEntity): String { + return "${data.properties["maxSpeed"]}" + } + /** *获取道路功能等级文字 */ @@ -66,6 +80,8 @@ class SignUtil { 2008 -> "种别" //道路方向 2010 -> "方向" + //常规线限速 + 2019 -> "线限速" //车道数 2041 -> "车道数" //常规点限速 @@ -76,8 +92,12 @@ class SignUtil { 4004 -> "可变点限速" //普通交限 4006 -> "普通交限" + //电子眼 + 4010 -> "电子眼" //交通灯 4022 -> "交通灯" + //交限 + 4601 -> "车信" else -> "" } } @@ -87,19 +107,11 @@ class SignUtil { */ fun getSignBottomRightText(data: RenderEntity): String { return when (data.code) { + //条件点限速 4003 -> getConditionLimitText(data) - else -> "" - } - } - - /** - * 更多信息展示文字 - */ - fun getMoreInfoText(data: RenderEntity): String { - return when (data.code) { - //条件点限速 - 4003 -> getConditionLimitMoreInfoText(data) + //电子眼 + 4010 -> data.properties["name"].toString() else -> "" } } @@ -107,10 +119,42 @@ class SignUtil { /** * 条件点限速更多信息 */ - private fun getConditionLimitMoreInfoText(data: RenderEntity): String { - return data.properties["validPeriod"].toString() + fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List { + + val list = mutableListOf() + val maxSpeed = renderEntity.properties["maxSpeed"] + if (maxSpeed != null) { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "最高限速值(km/h)", text = maxSpeed + ) + ) + } + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "限速条件", text = getConditionLimitText(renderEntity) + ) + ) + val carType = renderEntity.properties["vehicleType"] + if (carType != "0") { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt()) + ) + ) + } + val time = renderEntity.properties["validPeriod"] + if (time?.isNotEmpty() == true) { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "时间段", text = time + ) + ) + } + return list } + /** * 条件点限速文字 */ @@ -160,21 +204,31 @@ class SignUtil { /** * 获取限速值文字 */ - private fun getSpeedLimitText(data: RenderEntity): String { + private fun getSpeedLimitMaxText(data: RenderEntity): String { try { //限速标志 0 限速开始 1 限速解除 val maxSpeed = data.properties["maxSpeed"] - val minSpeed = data.properties["minSpeed"] - return if (maxSpeed != "0") - maxSpeed.toString() - else - minSpeed.toString() + return maxSpeed.toString() } catch (e: Exception) { Log.e("jingo", "获取限速面板ICON出错1 $e") } return "" } + /** + * 获取限速值文字 + */ + fun getSpeedLimitMinText(data: RenderEntity): String { + try { + //限速标志 0 限速开始 1 限速解除 + val minSpeed = data.properties["minSpeed"] + return minSpeed.toString() + } catch (e: Exception) { + Log.e("jingo", "获取限速面板ICON出错1 $e") + } + return "0" + } + /** * 获取种别名称 */ @@ -182,6 +236,25 @@ class SignUtil { return data.properties["kind"].toString() } + /** + * 常规点限速更多信息 + */ + fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List { + + val list = mutableListOf() + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "最高限速值(km/h)", text = getSpeedLimitMaxText(renderEntity) + ) + ) + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "最低限速值(km/h)", text = getSpeedLimitMinText(renderEntity) + ) + ) + return list + } + /** * 限速图标 */ @@ -232,6 +305,8 @@ class SignUtil { 4003 -> getConditionalSpeedLimitIcon(data) //可变点限速 4004 -> R.drawable.icon_change_limit + //电子眼 + 4010 -> R.drawable.icon_electronic_eye //交通灯 4022 -> R.drawable.icon_traffic_light else -> 0 @@ -315,12 +390,11 @@ class SignUtil { * 获取道路播报语音文字 */ fun getRoadSpeechText(topSignList: MutableList): String { - if (topSignList.size == 0) - return "" + if (topSignList.size == 0) return "" val stringBuffer = StringBuffer() stringBuffer.append("当前道路") for (item in topSignList) { - when (item.elementCode) { + when (item.renderEntity.code) { 2002 -> stringBuffer.append("功能等级${item.iconText.substring(2)}级,") 2008 -> stringBuffer.append("种别${item.iconText},") 2010 -> stringBuffer.append("${item.iconText},") @@ -329,5 +403,242 @@ class SignUtil { } return stringBuffer.toString() } + + + fun getRoadNameList(data: RenderEntity): MutableList { + val list = mutableListOf() + if (data.code == 2011) { + try { + val shapeStr = data.properties["shapeList"] + val array = JSONArray(shapeStr) + for (i in 0 until array.length()) { + val jsonObject = array.getJSONObject(0) + val name = jsonObject.optString("name", "") + val type = jsonObject.optInt("nameType", 0) + val seqNum = jsonObject.optInt("seqNum", 1) + val nameClass = jsonObject.optInt("nameClass", 1) + val bean = RoadNameBean( + name = name, type = type, seqNum = seqNum, nameClass = nameClass + ) + list.add(bean) + } + /** + * 排序 + */ + list.sortWith { n1, n2 -> + if (n1.nameClass != n2.nameClass) { + n1.nameClass.compareTo(n2.nameClass) + } else { + n1.seqNum.compareTo(n2.seqNum) + } + } + } catch (e: Exception) { + + } + } + return list + } + + /** + * 是否要有详细信息需要展示 + */ + fun isMoreInfo(element: RenderEntity): Boolean { + val isMore = when (element.code) { + //常规点限速 + 4002 -> getSpeedLimitMinText(element) != "0" + //条件点限速 + 4003 -> true + //电子眼 + 4010 -> true + else -> false + } + return isMore + } + + + /** + * 获取电子眼详细信息 + */ + fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List { + val list = mutableListOf() + val kindCode = renderEntity.properties["kind"]!!.toInt() + val kind = ElectronicEyeMoreInfoAdapterItem( + title = "电子眼类型", text = getElectronicEyeKindType(kindCode) + ) + list.add(kind) + when (kindCode) { + 1, 2, 3, 4, 5, 6, 20, 21 -> { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "限速值(km/h)", + text = renderEntity.properties["speedLimit"].toString() + ) + ) + } + } + val carType = renderEntity.properties["vehicleType"] + if (carType != null && carType != "0") { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "车辆类型", + text = getElectronicEyeVehicleType(carType.toInt()) + ) + ) + } + val time = renderEntity.properties["validPeriod"] + if (time?.isNotEmpty() == true) { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "时间段", text = time + ) + ) + } + if (kindCode == 20 || kindCode == 21) { + list.add( + ElectronicEyeMoreInfoAdapterItem( + title = "区间测试配对", text = renderEntity.properties["pairEleceyeId"].toString() + ) + ) + } + return list + } + + /** + * 获取电子眼车辆类型 + */ + private fun getElectronicEyeVehicleType(type: Int): String { + var stringBuffer = StringBuffer() + for (i in 31 downTo 0) { + val bit = (type shr i) and 1 + if (bit == 1) { + when (i) { + 0 -> stringBuffer.append("其他 ") + 1 -> stringBuffer.append("小汽车 ") + 2 -> stringBuffer.append("公交车 ") + 3 -> stringBuffer.append("多人乘坐车辆 ") + 4 -> stringBuffer.append("配送车 ") + 5 -> stringBuffer.append("摩托车 ") + 6 -> stringBuffer.append("行人 ") + 7 -> stringBuffer.append("自行车 ") + 8 -> stringBuffer.append("出租车 ") + 10 -> stringBuffer.append("紧急车辆 ") + 11 -> stringBuffer.append("运输卡车 ") + } + } + } + + return stringBuffer.toString() + } + + /** + * 获取电子眼类型 + */ + private fun getElectronicEyeKindType(kind: Int): String { + return when (kind) { + 0 -> "未调查" + 1 -> "超高速" + 2 -> "超低速" + 3 -> "移动式测速" + 4 -> "可变限速" + 5 -> "分车道限速" + 6 -> "分车种限速" + 7 -> "违规用灯" + 8 -> "违规占车道" + 9 -> "违规过路口" + 10 -> "机动车闯红灯" + 11 -> "路况监控" + 12 -> "单行线" + 13 -> "占用非机动车道" + 14 -> "出入口" + 15 -> "占用公交车专用道" + 16 -> "禁止左右转" + 17 -> "禁止掉头" + 18 -> "占用应急车道" + 19 -> "违反禁止标线" + 20 -> "区间测速开始" + 21 -> "区间测速结束" + 22 -> "违章停车" + 23 -> "尾号限行" + 24 -> "环保限行" + 25 -> "不系安全带" + 26 -> "开车打手机" + 27 -> "礼让行人" + 28 -> "违反禁令标志" + 29 -> "禁止鸣笛" + 30 -> "车辆未按规定年检" + 31 -> "车辆尾气超标" + 32 -> "ETC拍照计费电子眼" + 33 -> "专用车道电子眼预留" + 34 -> "交通标线电子眼预留" + 35 -> "违章电子眼预留" + 36 -> "卡车超限电子眼" + 37 -> "限时长停车电子眼" + else -> "无效类型" + } + } + + /** + * 获取车信图标 + */ + fun getLineInfoIcons(renderEntity: RenderEntity): List { + val list = mutableListOf() + try { + var laneinfoGroup = renderEntity.properties["laneinfoGroup"] + if (laneinfoGroup != null) { + laneinfoGroup = laneinfoGroup.substring(1, laneinfoGroup.length - 1) + laneinfoGroup = "[$laneinfoGroup]" + } + val jsonArray = JSONArray(laneinfoGroup) + if (jsonArray.length() == 2) { + val itemArray = jsonArray[0] + val typeArray = jsonArray[1] + if ((itemArray is JSONArray) && (typeArray is JSONArray) && itemArray.length() == typeArray.length()) { + for (i in 0 until itemArray.length()) { + val itemObject = itemArray[i] + val type = typeArray[i] + var laneInfo = "laneinfo_${itemObject.toString().replace(",", "_")}" + list.add( + LaneInfoItem( + id = getResId( + laneInfo, R.drawable::class.java + ), type = type!!.toString().toInt() + ) + ) + } + } + } + + } catch (e: Exception) { + Log.e("jingo", "json 解析失败") + } + return list + } + + /** + * 通过字符串名称获取资源id + */ + private fun getResId(variableName: String, c: Class<*>): Int { + return try { + val idField: Field = c.getDeclaredField(variableName) + idField.getInt(idField) + } catch (e: java.lang.Exception) { + e.printStackTrace() + R.drawable.laneinfo_0 + } + } + + /** + * 道路信息排序用的 + */ + fun getRoadInfoIndex(element: RenderEntity): Int { + return when (element.code) { + 2041 -> 0 + 2008 -> 1 + 2002 -> 2 + 2019 -> 3 + 2010 -> 4 + else -> 999 + } + } } } \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/icon_finish_disable.png b/app/src/main/res/drawable-xhdpi/icon_finish_disable.png new file mode 100644 index 00000000..626e4b3d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_finish_disable.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_finish_nor.png b/app/src/main/res/drawable-xhdpi/icon_finish_nor.png new file mode 100644 index 00000000..c09a06a8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_finish_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_finish_press.png b/app/src/main/res/drawable-xhdpi/icon_finish_press.png new file mode 100644 index 00000000..f572d57d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_finish_press.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_forward_disable.png b/app/src/main/res/drawable-xhdpi/icon_forward_disable.png new file mode 100644 index 00000000..63978baf Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_forward_disable.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_forward_nor.png b/app/src/main/res/drawable-xhdpi/icon_forward_nor.png new file mode 100644 index 00000000..c8a5a518 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_forward_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_forward_press.png b/app/src/main/res/drawable-xhdpi/icon_forward_press.png new file mode 100644 index 00000000..5beaed1d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_forward_press.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_mediaflag.png b/app/src/main/res/drawable-xhdpi/icon_mediaflag.png new file mode 100644 index 00000000..2ba4e658 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_mediaflag.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_mediaflag_disable.png b/app/src/main/res/drawable-xhdpi/icon_mediaflag_disable.png new file mode 100644 index 00000000..09f8a835 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_mediaflag_disable.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_next_disable.png b/app/src/main/res/drawable-xhdpi/icon_next_disable.png new file mode 100644 index 00000000..41a0abe7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_next_disable.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_next_nor.png b/app/src/main/res/drawable-xhdpi/icon_next_nor.png new file mode 100644 index 00000000..fe4a563d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_next_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_next_press.png b/app/src/main/res/drawable-xhdpi/icon_next_press.png new file mode 100644 index 00000000..9863d55c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_next_press.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_no_mediaflag.png b/app/src/main/res/drawable-xhdpi/icon_no_mediaflag.png new file mode 100644 index 00000000..feaf39a7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_no_mediaflag.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_pause_nor.png b/app/src/main/res/drawable-xhdpi/icon_pause_nor.png new file mode 100644 index 00000000..e2aa3f68 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_pause_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_play_disable.png b/app/src/main/res/drawable-xhdpi/icon_play_disable.png new file mode 100644 index 00000000..c421e09b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_play_disable.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_play_nor.png b/app/src/main/res/drawable-xhdpi/icon_play_nor.png new file mode 100644 index 00000000..643fb4d2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_play_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_select_point_disable.png b/app/src/main/res/drawable-xhdpi/icon_select_point_disable.png new file mode 100644 index 00000000..f0573f27 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_select_point_disable.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_select_point_nor.png b/app/src/main/res/drawable-xhdpi/icon_select_point_nor.png new file mode 100644 index 00000000..e1e8b2f9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_select_point_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_select_point_press.png b/app/src/main/res/drawable-xhdpi/icon_select_point_press.png new file mode 100644 index 00000000..f0b0cbc3 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_select_point_press.png differ diff --git a/app/src/main/res/drawable-xhdpi/scan_light.png b/app/src/main/res/drawable-xhdpi/scan_light.png new file mode 100644 index 00000000..1acef0b8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/scan_light.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png b/app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png new file mode 100644 index 00000000..90f752e3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_electronic_eye.png b/app/src/main/res/drawable-xxhdpi/icon_electronic_eye.png new file mode 100644 index 00000000..2ffcd7bb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_electronic_eye.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_electronic_eye_left.png b/app/src/main/res/drawable-xxhdpi/icon_electronic_eye_left.png new file mode 100644 index 00000000..c79d9b7c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_electronic_eye_left.png differ diff --git a/app/src/main/res/drawable/baseline_cancel_24.xml b/app/src/main/res/drawable/baseline_cancel_24.xml new file mode 100644 index 00000000..082ea0a2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_cancel_24.xml @@ -0,0 +1,11 @@ + + + + diff --git a/app/src/main/res/drawable/icon_picture_left.xml b/app/src/main/res/drawable/icon_picture_left.xml new file mode 100644 index 00000000..6b209f26 --- /dev/null +++ b/app/src/main/res/drawable/icon_picture_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_picture_right.xml b/app/src/main/res/drawable/icon_picture_right.xml new file mode 100644 index 00000000..d10a68d5 --- /dev/null +++ b/app/src/main/res/drawable/icon_picture_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/laneinfo_0.xml b/app/src/main/res/drawable/laneinfo_0.xml new file mode 100644 index 00000000..3323c731 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_0.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1.xml b/app/src/main/res/drawable/laneinfo_1.xml new file mode 100644 index 00000000..b178f970 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2.xml b/app/src/main/res/drawable/laneinfo_1_2.xml new file mode 100644 index 00000000..afb0be5d --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2_3.xml b/app/src/main/res/drawable/laneinfo_1_2_3.xml new file mode 100644 index 00000000..fd8815a6 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2_3.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2_4.xml b/app/src/main/res/drawable/laneinfo_1_2_4.xml new file mode 100644 index 00000000..95e58d21 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2_4.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2_5.xml b/app/src/main/res/drawable/laneinfo_1_2_5.xml new file mode 100644 index 00000000..6c124f43 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_2_6.xml b/app/src/main/res/drawable/laneinfo_1_2_6.xml new file mode 100644 index 00000000..a7016e1a --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_2_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_3.xml b/app/src/main/res/drawable/laneinfo_1_3.xml new file mode 100644 index 00000000..cdee0af7 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_3.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_3_4.xml b/app/src/main/res/drawable/laneinfo_1_3_4.xml new file mode 100644 index 00000000..1f63c983 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_3_4.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_3_5.xml b/app/src/main/res/drawable/laneinfo_1_3_5.xml new file mode 100644 index 00000000..59bae6fa --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_3_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_3_6.xml b/app/src/main/res/drawable/laneinfo_1_3_6.xml new file mode 100644 index 00000000..ce021027 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_3_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_4.xml b/app/src/main/res/drawable/laneinfo_1_4.xml new file mode 100644 index 00000000..a10bf8b1 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_4.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_5.xml b/app/src/main/res/drawable/laneinfo_1_5.xml new file mode 100644 index 00000000..95bc3794 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_5.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_6.xml b/app/src/main/res/drawable/laneinfo_1_6.xml new file mode 100644 index 00000000..a976d2bb --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_6.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_1_7.xml b/app/src/main/res/drawable/laneinfo_1_7.xml new file mode 100644 index 00000000..3f1b8239 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_1_7.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_2.xml b/app/src/main/res/drawable/laneinfo_2.xml new file mode 100644 index 00000000..75695b9c --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_3.xml b/app/src/main/res/drawable/laneinfo_2_3.xml new file mode 100644 index 00000000..e81ba91b --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_3.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_3_4.xml b/app/src/main/res/drawable/laneinfo_2_3_4.xml new file mode 100644 index 00000000..b351064d --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_3_4.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_4.xml b/app/src/main/res/drawable/laneinfo_2_4.xml new file mode 100644 index 00000000..744a41da --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_4.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_5.xml b/app/src/main/res/drawable/laneinfo_2_5.xml new file mode 100644 index 00000000..a5506bef --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_2_6.xml b/app/src/main/res/drawable/laneinfo_2_6.xml new file mode 100644 index 00000000..8ce8581b --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_2_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_3.xml b/app/src/main/res/drawable/laneinfo_3.xml new file mode 100644 index 00000000..96609d0c --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_3.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_3_4.xml b/app/src/main/res/drawable/laneinfo_3_4.xml new file mode 100644 index 00000000..bd615d3d --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_3_4.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_3_5.xml b/app/src/main/res/drawable/laneinfo_3_5.xml new file mode 100644 index 00000000..31c37b1f --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_3_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_3_6.xml b/app/src/main/res/drawable/laneinfo_3_6.xml new file mode 100644 index 00000000..7cac3588 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_3_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_4.xml b/app/src/main/res/drawable/laneinfo_4.xml new file mode 100644 index 00000000..7587877c --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_4.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/laneinfo_4_5.xml b/app/src/main/res/drawable/laneinfo_4_5.xml new file mode 100644 index 00000000..a5216c51 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_4_5.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_4_6.xml b/app/src/main/res/drawable/laneinfo_4_6.xml new file mode 100644 index 00000000..bd615d3d --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_4_6.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_5.xml b/app/src/main/res/drawable/laneinfo_5.xml new file mode 100644 index 00000000..b35bd7a3 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_5.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_5_6.xml b/app/src/main/res/drawable/laneinfo_5_6.xml new file mode 100644 index 00000000..f3cf04f7 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_5_6.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/laneinfo_6.xml b/app/src/main/res/drawable/laneinfo_6.xml new file mode 100644 index 00000000..fd617e7f --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_6.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/laneinfo_7.xml b/app/src/main/res/drawable/laneinfo_7.xml new file mode 100644 index 00000000..8dfa5d45 --- /dev/null +++ b/app/src/main/res/drawable/laneinfo_7.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/map_trace_finish.xml b/app/src/main/res/drawable/map_trace_finish.xml new file mode 100644 index 00000000..013c9395 --- /dev/null +++ b/app/src/main/res/drawable/map_trace_finish.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/map_trace_forward.xml b/app/src/main/res/drawable/map_trace_forward.xml new file mode 100644 index 00000000..4f0afa14 --- /dev/null +++ b/app/src/main/res/drawable/map_trace_forward.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/map_trace_mediaflag.xml b/app/src/main/res/drawable/map_trace_mediaflag.xml new file mode 100644 index 00000000..6c196508 --- /dev/null +++ b/app/src/main/res/drawable/map_trace_mediaflag.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/map_trace_next.xml b/app/src/main/res/drawable/map_trace_next.xml new file mode 100644 index 00000000..59e80266 --- /dev/null +++ b/app/src/main/res/drawable/map_trace_next.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/map_trace_pause.xml b/app/src/main/res/drawable/map_trace_pause.xml new file mode 100644 index 00000000..006cc188 --- /dev/null +++ b/app/src/main/res/drawable/map_trace_pause.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/map_trace_select_point.xml b/app/src/main/res/drawable/map_trace_select_point.xml new file mode 100644 index 00000000..0c0ed8bb --- /dev/null +++ b/app/src/main/res/drawable/map_trace_select_point.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_dashed_line.xml b/app/src/main/res/drawable/shape_dashed_line.xml new file mode 100644 index 00000000..843c76c1 --- /dev/null +++ b/app/src/main/res/drawable/shape_dashed_line.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/app/src/main/res/drawable/shape_road_name_bg.xml b/app/src/main/res/drawable/shape_road_name_bg.xml new file mode 100644 index 00000000..7b1a14f6 --- /dev/null +++ b/app/src/main/res/drawable/shape_road_name_bg.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_vertical_dashed_line.xml b/app/src/main/res/drawable/shape_vertical_dashed_line.xml new file mode 100644 index 00000000..5aa1a4bd --- /dev/null +++ b/app/src/main/res/drawable/shape_vertical_dashed_line.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 77fc36a0..eb4204c8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -44,79 +44,35 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - + + - - - - - - - - + app:layout_constraintLeft_toLeftOf="@id/main_activity_top_sign_recyclerview" + app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + + + @@ -432,10 +472,10 @@ android:id="@+id/main_bottom_route_text" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:onClick="@{()->mainActivity.onClickRouteFragment()}" android:text="路径规划" android:textColor="@color/blue" android:textSize="10sp" - android:onClick="@{()->mainActivity.onClickRouteFragment()}" app:layout_constraintBottom_toBottomOf="@id/main_activity_bottom_sheet_bg" app:layout_constraintLeft_toLeftOf="@id/main_bottom_route" app:layout_constraintRight_toRightOf="@id/main_bottom_route" diff --git a/app/src/main/res/layout/activity_qr_code.xml b/app/src/main/res/layout/activity_qr_code.xml new file mode 100644 index 00000000..c3ae875e --- /dev/null +++ b/app/src/main/res/layout/activity_qr_code.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_result.xml b/app/src/main/res/layout/activity_result.xml new file mode 100644 index 00000000..37e4275c --- /dev/null +++ b/app/src/main/res/layout/activity_result.xml @@ -0,0 +1,19 @@ + + + + + +