diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt index 975bdb7..d3f95da 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt index 975bdb7..d3f95da 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt index 66fcf72..615dd22 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt index 975bdb7..d3f95da 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt index 66fcf72..615dd22 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt index cf311f5..134f657 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt index 975bdb7..d3f95da 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt index 66fcf72..615dd22 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt index cf311f5..134f657 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt index ea3c24f..15b3141 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt @@ -27,13 +27,14 @@ response, object : TypeToken() {}.type ) loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) + "登录成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt index 975bdb7..d3f95da 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt index 66fcf72..615dd22 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt index cf311f5..134f657 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt index ea3c24f..15b3141 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt @@ -27,13 +27,14 @@ response, object : TypeToken() {}.type ) loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) + "登录成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt index 180feb5..977daff 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt @@ -30,10 +30,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt index 975bdb7..d3f95da 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt index 66fcf72..615dd22 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt index cf311f5..134f657 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt index ea3c24f..15b3141 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt @@ -27,13 +27,14 @@ response, object : TypeToken() {}.type ) loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) + "登录成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt index 180feb5..977daff 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt @@ -30,10 +30,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt index f5e5c7b..aaaee65 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt @@ -1,6 +1,7 @@ package com.casic.br.operationsite.vm import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.base.BaseApplication import com.casic.br.operationsite.extensions.separateResponseCode import com.casic.br.operationsite.model.UserDetailModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager @@ -8,6 +9,7 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel @@ -33,6 +35,7 @@ flag.value = false } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt index 975bdb7..d3f95da 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt index 66fcf72..615dd22 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt index cf311f5..134f657 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt index ea3c24f..15b3141 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt @@ -27,13 +27,14 @@ response, object : TypeToken() {}.type ) loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) + "登录成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt index 180feb5..977daff 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt @@ -30,10 +30,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt index f5e5c7b..aaaee65 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt @@ -1,6 +1,7 @@ package com.casic.br.operationsite.vm import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.base.BaseApplication import com.casic.br.operationsite.extensions.separateResponseCode import com.casic.br.operationsite.model.UserDetailModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager @@ -8,6 +9,7 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel @@ -33,6 +35,7 @@ flag.value = false } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt index 1aee0a3..55d3f5e 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt @@ -31,9 +31,11 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 036561c..2fbcfbc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -12,7 +14,6 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.br.operationsite" @@ -20,16 +21,16 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - abiFilters "arm64-v8a", "armeabi-v7a" - } } } @@ -47,19 +48,27 @@ coroutines 'enable' } } + viewBinding { + enabled true + } applicationVariants.all { variant -> variant.outputs.all { - outputFileName = defaultConfig.versionName + ".apk" + outputFileName = "BR_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" } } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'com.google.android.material:material:1.6.1' //仿iOS风格RadioGroup implementation 'info.hoang8f:android-segmented:1.0.6' @@ -71,13 +80,11 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,16 +104,14 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德导航(带有地图,无需再依赖地图) - implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' //高德地图搜索 implementation 'com.amap.api:search:8.1.0' - //高德定位 - implementation 'com.amap.api:location:5.3.1' //CameraX def CameraX_version = '1.1.0' implementation "androidx.camera:camera-core:${CameraX_version}" implementation "androidx.camera:camera-camera2:${CameraX_version}" implementation "androidx.camera:camera-lifecycle:${CameraX_version}" - implementation 'androidx.camera:camera-view:1.0.0-alpha32' + implementation 'androidx.camera:camera-view:1.2.0-alpha02' } \ No newline at end of file diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 902751b..cd82ee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - holder.groupNameView.text = rowsBean.projectName - holder.projectAreaView.text = rowsBean.area - holder.projectTypeView.text = rowsBean.projectType - holder.projectLocationView.text = rowsBean.location - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var groupNameView: TextView = view.findViewById(R.id.groupNameView) - var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) - var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) - var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt b/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt deleted file mode 100644 index 6f8a036..0000000 --- a/app/src/main/java/com/casic/br/operationsite/adapter/WorkingListAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.casic.br.operationsite.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.model.WorkSiteListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class WorkingListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_working_rv, parent, false) - ) - } - - override fun getItemCount(): Int = dataRows.size - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - - if (dataRows[position].imageUrl.isNullOrBlank()) { - holder.workSiteImageView.setImageResource(R.mipmap.ic_launcher) - } else { - Glide.with(context) - .load(dataRows[position].imageUrl.combineImagePath()) - .into(holder.workSiteImageView) - } - holder.workTitleView.text = rowsBean.workTitle - holder.workPersonView.text = String.format("现场负责人:${rowsBean.workPerson}") - holder.connectionPhoneView.text = String.format("联系电话:${rowsBean.connectionPhone}") - holder.workSiteView.text = String.format("现场描述:${rowsBean.workSiteDesc}") - - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - } - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var workSiteImageView: QMUIRadiusImageView = view.findViewById(R.id.workSiteImageView) - var workTitleView: TextView = view.findViewById(R.id.workTitleView) - var workPersonView: TextView = view.findViewById(R.id.workPersonView) - var connectionPhoneView: TextView = view.findViewById(R.id.connectionPhoneView) - var workSiteView: TextView = view.findViewById(R.id.workSiteView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClicked(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt index c842066..f6b307f 100644 --- a/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/operationsite/base/BaseApplication.kt @@ -7,14 +7,14 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() - fun obtainInstance() = instance + fun get() = application } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt new file mode 100644 index 0000000..80029cd --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/extensions/Poi.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.extensions + +import android.content.Context +import com.amap.api.maps.model.Poi +import com.amap.api.navi.AmapNaviPage +import com.amap.api.navi.AmapNaviParams +import com.amap.api.navi.AmapNaviType +import com.amap.api.navi.AmapPageType + +/** + * 导航扩展函数 + * */ +fun Poi.showRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.WALK, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} + +fun Poi.showBusRouteOnMap(context: Context) { + val params = AmapNaviParams( + null, null, this, + AmapNaviType.DRIVER, + AmapPageType.ROUTE + ) + AmapNaviPage.getInstance().showRouteActivity(context, params, null) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index 03b76c0..fde3336 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_completed.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class CompletedFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071502) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - completedRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + completedRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - completedRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index e8c4bcd..f7fd6d2 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,11 +28,14 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_not_start.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class NotStartFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -45,7 +52,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -84,7 +91,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -108,7 +115,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071501) } - }) + } } private fun obtainProjectListByPage() { @@ -127,15 +134,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } notStartRecyclerView!!.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - notStartRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7f346be..569ead0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration +import com.bumptech.glide.Glide import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.WorkingListAdapter +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel @@ -16,6 +18,8 @@ import com.casic.br.operationsite.vm.WorkSiteViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -24,12 +28,15 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WorkingFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var workingListAdapter: WorkingListAdapter + private lateinit var workingListAdapter: NormalRecyclerAdapter private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var broadcastManager: BroadcastManager private var dataBeans: MutableList = ArrayList() @@ -46,7 +53,7 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - workSiteViewModel = ViewModelProvider(this).get(WorkSiteViewModel::class.java) + workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] broadcastManager = BroadcastManager.obtainInstance(requireContext()) broadcastManager.addAction(object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -85,7 +92,7 @@ obtainProjectListByPage() } - workSiteViewModel.worksiteModel.observe(this, { + workSiteViewModel.worksiteModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -109,7 +116,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071101) } - }) + } } private fun obtainProjectListByPage() { @@ -128,15 +135,51 @@ } } else { emptyView!!.hide() - workingListAdapter = WorkingListAdapter(requireContext(), dataBeans) - workingRecyclerView!!.addItemDecoration( + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: WorkSiteListModel.DataBean.RowsBean + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + val imagePath = item.imageUrl.combineImagePath() + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imagePath).submit() + .get() + } + viewHolder.setImageResource( + R.id.workSiteImageView, drawable + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPerson}") + .setText(R.id.connectionPhoneView, "联系电话:${item.connectionPhone}") + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + } + } + workingRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - workingRecyclerView!!.adapter = workingListAdapter - workingListAdapter.setOnItemClickListener(object : - WorkingListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - requireContext().navigatePageTo(dataBeans[position].id) + workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataBean.RowsBean + ) { + requireContext().navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt index bd0a12f..a6f4713 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmDetailActivity.kt @@ -56,21 +56,21 @@ /** * 数据初始化 * */ - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { alarmViewModel.obtainAlarmDetail(id) - alarmViewModel.detailModel.observe(this, { + alarmViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data @@ -101,7 +101,7 @@ timeView.text = detailData.createTime descriptionView.text = detailData.alarmDescription } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 493180f..a72dd86 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -4,14 +4,14 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.casic.br.operationsite.R -import com.casic.br.operationsite.adapter.AlarmListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.AlarmViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -26,7 +26,7 @@ class AlarmListActivity : KotlinBaseActivity() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 @@ -50,18 +50,18 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] } override fun observeRequestState() { - alarmViewModel.loadState.observe(this, { + alarmViewModel.loadState.observe(this) { if (!isLoadMore && !isRefresh) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } } - }) + } } override fun onResume() { @@ -82,7 +82,7 @@ obtainAlarmListByPage() } - alarmViewModel.alarmModel.observe(this, { + alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -106,7 +106,7 @@ } weakReferenceHandler.sendEmptyMessage(2022071201) } - }) + } } private fun obtainAlarmListByPage() { @@ -125,16 +125,31 @@ } } else { emptyView!!.hide() - alarmListAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView!!.addItemDecoration( + alarmListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_alarm_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.groupNameView, item.projectName) + .setText(R.id.projectAreaView, item.area) + .setText(R.id.projectTypeView, item.projectType) + .setText(R.id.projectLocationView, item.location) + } + } + alarmRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) ) - alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) - alarmRecyclerView!!.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickListener(object : - AlarmListAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - navigatePageTo(dataBeans[position].id) + alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataBean.RowsBean + ) { + navigatePageTo(t.id) } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt index 6561c14..3dfc9a0 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ApplyEnterActivity.kt @@ -28,8 +28,6 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_apply_enter.* -import kotlinx.android.synthetic.main.activity_apply_enter.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_upload_activity.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File @@ -54,8 +52,8 @@ } override fun initData() { - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - applyViewModel = ViewModelProvider(this).get(ApplyViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + applyViewModel = ViewModelProvider(this)[ApplyViewModel::class.java] imageAdapter = EditableImageAdapter(this, 1, 13f) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) @@ -84,19 +82,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - applyViewModel.loadState.observe(this, { + applyViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "申请中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -150,7 +148,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val url = it.data.toString() if (url.isNotBlank()) { @@ -159,7 +157,7 @@ } imageAdapter.setupImage(realPaths) } - }) + } confirmApplyButton.setOnClickListener { if (workerNameView.text.isNullOrBlank()) { @@ -193,11 +191,11 @@ System.currentTimeMillis().timestampToCompleteDate() ) - applyViewModel.resultModel.observe(this, { + applyViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt index ae21c22..e74bb87 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/FaceDetectActivity.kt @@ -146,10 +146,10 @@ @SuppressLint("UnsafeOptInUsageError") private fun observeCameraState(cameraInfo: CameraInfo) { - cameraInfo.cameraState.observe(this, { + cameraInfo.cameraState.observe(this) { //开始预览之后才人脸检测 if (it.type == CameraState.Type.OPEN) { - imageAnalysis.setAnalyzer(executor, { imageProxy -> + imageAnalysis.setAnalyzer(executor) { imageProxy -> /** * 相机源数据是 YUV_420_888 !!! * */ @@ -178,9 +178,9 @@ imageProxy.close() } } - }) + } } - }) + } } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt index 557f92f..64f69ca 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/LoginActivity.kt @@ -2,7 +2,10 @@ import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.AuthenticationHelper +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.RSAUtils import com.casic.br.operationsite.vm.AuthenticateViewModel import com.casic.br.operationsite.vm.LoginViewModel import com.casic.br.operationsite.vm.UserDetailViewModel @@ -33,18 +36,18 @@ // 设置默认账号密码 userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) - authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) - loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { - loginViewModel.loadState.observe(this, { loginState -> + loginViewModel.loadState.observe(this) { loginState -> when (loginState) { is LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -63,7 +66,7 @@ SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) authenticateViewModel.obtainPublicKey() } - authenticateViewModel.keyModel.observe(this, { + authenticateViewModel.keyModel.observe(this) { if (it.code == 200) {//用code判断,别的判断可能有坑 val keyString = it.data!!.publicKey!! /** @@ -78,7 +81,7 @@ RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey) - loginViewModel.enterResultModel.observe(this, { loginResult -> + loginViewModel.enterResultModel.observe(this) { loginResult -> if (loginResult.code == 200) { AuthenticationHelper.saveToken(loginResult.data!!.token!!) /** @@ -89,8 +92,8 @@ navigatePageTo() finish() } - }) + } } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt index 0d9b80c..6ea0ff5 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/SplashScreenActivity.kt @@ -20,7 +20,7 @@ } override fun initData() { - userDetailViewModel = ViewModelProvider(this).get(UserDetailViewModel::class.java) + userDetailViewModel = ViewModelProvider(this)[UserDetailViewModel::class.java] } override fun observeRequestState() { @@ -37,14 +37,14 @@ * 获取token之后保存用户信息 * */ userDetailViewModel.obtainUserDetail() - userDetailViewModel.flag.observe(this@SplashScreenActivity, { + userDetailViewModel.flag.observe(this@SplashScreenActivity) { if (it) { navigatePageTo() } else { navigatePageTo() } finish() - }) + } } override fun onTick(millisUntilFinished: Long) { diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 0dd9ebb..9153ea2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -15,7 +15,10 @@ import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.reformat import com.casic.br.operationsite.model.UserDetailModel -import com.casic.br.operationsite.utils.* +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LoadingDialogHub +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationHelper import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -27,7 +30,10 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.* +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -71,8 +77,8 @@ } weakReferenceHandler = WeakReferenceHandler(callback) - uploadFileViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) - eventViewModel = ViewModelProvider(this).get(EventViewModel::class.java) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter @@ -84,19 +90,19 @@ } override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this, { + uploadFileViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } - eventViewModel.loadState.observe(this, { + eventViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "事件提交中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { @@ -121,7 +127,7 @@ } }) - uploadFileViewModel.resultModel.observe(this, { + uploadFileViewModel.resultModel.observe(this) { if (it.code == 200) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { @@ -135,7 +141,7 @@ "最多只能上传3张图片".show(this) } } - }) + } siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -181,11 +187,11 @@ ) } - eventViewModel.resultModel.observe(this, { + eventViewModel.resultModel.observe(this) { if (it.code == 200) { finish() } - }) + } } private fun selectPicture() { diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index e9baf29..ef7be21 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -12,6 +12,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.br.operationsite.R +import com.casic.br.operationsite.extensions.showRouteOnMap import com.casic.br.operationsite.utils.LoadingDialogHub import com.casic.br.operationsite.vm.WorkSiteViewModel import com.gyf.immersionbar.ImmersionBar @@ -19,7 +20,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.showRouteOnMap import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState @@ -66,17 +66,17 @@ } override fun observeRequestState() { - workSiteViewModel.loadState.observe(this, { + workSiteViewModel.loadState.observe(this) { when (it) { LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") else -> LoadingDialogHub.dismiss() } - }) + } } override fun initEvent() { workSiteViewModel.obtainProjectDetail(id) - workSiteViewModel.detailModel.observe(this, { + workSiteViewModel.detailModel.observe(this) { if (it.code == 200) { val detailData = it.data projectNameView.text = detailData.workTitle @@ -126,7 +126,7 @@ } }) } - }) + } navigationView.setOnClickListener { if (latLng == null) { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 6ed8f20..f7a5b3c 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -31,9 +31,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt index 975bdb7..d3f95da 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ApplyViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt index 66fcf72..615dd22 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AuthenticateViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt index cf311f5..134f657 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/EventViewModel.kt @@ -34,10 +34,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt index ea3c24f..15b3141 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt @@ -27,13 +27,14 @@ response, object : TypeToken() {}.type ) loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) + "登录成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt index 180feb5..977daff 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/UploadFileViewModel.kt @@ -30,10 +30,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt index f5e5c7b..aaaee65 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/UserDetailViewModel.kt @@ -1,6 +1,7 @@ package com.casic.br.operationsite.vm import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.base.BaseApplication import com.casic.br.operationsite.extensions.separateResponseCode import com.casic.br.operationsite.model.UserDetailModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager @@ -8,6 +9,7 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel @@ -33,6 +35,7 @@ flag.value = false } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt index 1aee0a3..55d3f5e 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt @@ -31,9 +31,11 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -48,9 +50,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_alarm_list.xml b/app/src/main/res/layout/activity_alarm_list.xml index 6dc756f..ab1a3aa 100644 --- a/app/src/main/res/layout/activity_alarm_list.xml +++ b/app/src/main/res/layout/activity_alarm_list.xml @@ -1,5 +1,6 @@ + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />