diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index 1c85152..f77cfb1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginOutViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ resultModel.value = RetrofitServiceManager.loginOut() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index 1c85152..f77cfb1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginOutViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ resultModel.value = RetrofitServiceManager.loginOut() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt index bd9b386..721ea5e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class NewEventViewModel : BaseViewModel() { @@ -22,5 +24,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index 1c85152..f77cfb1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginOutViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ resultModel.value = RetrofitServiceManager.loginOut() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt index bd9b386..721ea5e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class NewEventViewModel : BaseViewModel() { @@ -22,5 +24,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt index 3c478f1..bdbf93a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt @@ -1,20 +1,21 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class TaskRecordViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun searchByInspection(inspectionId: String) = - launch({ - resultModel.value = - RetrofitServiceManager.searchByInspection(inspectionId) - }, { - loadState.value = LoadState.Fail - }) + fun searchByInspection(inspectionId: String) = launch({ + resultModel.value = RetrofitServiceManager.searchByInspection(inspectionId) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index 1c85152..f77cfb1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginOutViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ resultModel.value = RetrofitServiceManager.loginOut() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt index bd9b386..721ea5e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class NewEventViewModel : BaseViewModel() { @@ -22,5 +24,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt index 3c478f1..bdbf93a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt @@ -1,20 +1,21 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class TaskRecordViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun searchByInspection(inspectionId: String) = - launch({ - resultModel.value = - RetrofitServiceManager.searchByInspection(inspectionId) - }, { - loadState.value = LoadState.Fail - }) + fun searchByInspection(inspectionId: String) = launch({ + resultModel.value = RetrofitServiceManager.searchByInspection(inspectionId) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt index b6d19ce..1b2a47e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState import java.io.File @@ -16,5 +18,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index 1c85152..f77cfb1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginOutViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ resultModel.value = RetrofitServiceManager.loginOut() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt index bd9b386..721ea5e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class NewEventViewModel : BaseViewModel() { @@ -22,5 +24,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt index 3c478f1..bdbf93a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt @@ -1,20 +1,21 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class TaskRecordViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun searchByInspection(inspectionId: String) = - launch({ - resultModel.value = - RetrofitServiceManager.searchByInspection(inspectionId) - }, { - loadState.value = LoadState.Fail - }) + fun searchByInspection(inspectionId: String) = launch({ + resultModel.value = RetrofitServiceManager.searchByInspection(inspectionId) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt index b6d19ce..1b2a47e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState import java.io.File @@ -16,5 +18,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index 6e4f910..030ecd8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index 1c85152..f77cfb1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginOutViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ resultModel.value = RetrofitServiceManager.loginOut() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt index bd9b386..721ea5e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class NewEventViewModel : BaseViewModel() { @@ -22,5 +24,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt index 3c478f1..bdbf93a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt @@ -1,20 +1,21 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class TaskRecordViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun searchByInspection(inspectionId: String) = - launch({ - resultModel.value = - RetrofitServiceManager.searchByInspection(inspectionId) - }, { - loadState.value = LoadState.Fail - }) + fun searchByInspection(inspectionId: String) = launch({ + resultModel.value = RetrofitServiceManager.searchByInspection(inspectionId) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt index b6d19ce..1b2a47e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState import java.io.File @@ -16,5 +18,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index 6e4f910..030ecd8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { diff --git a/app/src/main/res/layout/activity_guide.xml b/app/src/main/res/layout/activity_guide.xml index af3d28e..cf9db71 100644 --- a/app/src/main/res/layout/activity_guide.xml +++ b/app/src/main/res/layout/activity_guide.xml @@ -10,10 +10,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" + android:layout_alignParentBottom="true" + android:layout_margin="@dimen/dp_10" android:paddingHorizontal="@dimen/dp_7" android:paddingVertical="@dimen/dp_5" android:text="跳过\u30003" android:textColor="@color/white" app:qmui_backgroundColor="@color/transparentBlack" + app:qmui_borderWidth="0dp" app:qmui_radius="@dimen/dp_5" /> \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index 1c85152..f77cfb1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginOutViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ resultModel.value = RetrofitServiceManager.loginOut() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt index bd9b386..721ea5e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class NewEventViewModel : BaseViewModel() { @@ -22,5 +24,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt index 3c478f1..bdbf93a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt @@ -1,20 +1,21 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class TaskRecordViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun searchByInspection(inspectionId: String) = - launch({ - resultModel.value = - RetrofitServiceManager.searchByInspection(inspectionId) - }, { - loadState.value = LoadState.Fail - }) + fun searchByInspection(inspectionId: String) = launch({ + resultModel.value = RetrofitServiceManager.searchByInspection(inspectionId) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt index b6d19ce..1b2a47e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState import java.io.File @@ -16,5 +18,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index 6e4f910..030ecd8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { diff --git a/app/src/main/res/layout/activity_guide.xml b/app/src/main/res/layout/activity_guide.xml index af3d28e..cf9db71 100644 --- a/app/src/main/res/layout/activity_guide.xml +++ b/app/src/main/res/layout/activity_guide.xml @@ -10,10 +10,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" + android:layout_alignParentBottom="true" + android:layout_margin="@dimen/dp_10" android:paddingHorizontal="@dimen/dp_7" android:paddingVertical="@dimen/dp_5" android:text="跳过\u30003" android:textColor="@color/white" app:qmui_backgroundColor="@color/transparentBlack" + app:qmui_borderWidth="0dp" app:qmui_radius="@dimen/dp_5" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index c780a62..dbe28ee 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -95,7 +95,8 @@ android:layout_below="@id/loginButton" android:layout_marginHorizontal="@dimen/dp_50" android:layout_marginTop="@dimen/dp_10" - android:text="单机模式使用" /> + android:text="单机模式使用" + android:visibility="gone" /> - diff --git a/.idea/misc.xml b/.idea/misc.xml index e24734c..833ee83 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,10 +22,13 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 0e2f815..de76741 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' @@ -13,17 +15,14 @@ } } compileSdkVersion 31 - buildToolsVersion "30.0.3" defaultConfig { applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 31 - versionCode 2 - versionName "1.0.1" - ndk { - abiFilters "armeabi", "armeabi-v7a", "arm64-v8" - } + versionCode 1 + versionName "1.0.0.0" + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -39,11 +38,24 @@ targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + kotlin { experimental { coroutines 'enable' } } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "ZXB_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } greendao { schemaVersion 1//数据库版本号 @@ -52,12 +64,17 @@ } } +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation files('libs/lite-release.aar') - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -69,12 +86,11 @@ //fragment快速实现 implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" + 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.6.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //返回值转换器 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' @@ -88,15 +104,16 @@ implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //日期选择器 - implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //单项/数字、二三级联动、日期/时间等滚轮选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 - implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'io.github.lucksiege:pictureselector:v3.0.4' //高德地图 - implementation 'com.amap.api:3dmap:7.9.1' - implementation 'com.amap.api:location:5.3.1' + implementation 'com.amap.api:3dmap:9.6.0' //数据库框架 implementation 'org.greenrobot:greendao:3.3.0' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' } diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt deleted file mode 100644 index d30ea59..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.casic.birmm.inspect.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.birmm.inspect.R -import com.casic.birmm.inspect.model.EventListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class EventListAdapter( - private val context: Context, - private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - val imageArray = rowsBean.images?.split(",") - Glide.with(context).load(imageArray?.get(0)).into(holder.inspectImageView) - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - this.listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt deleted file mode 100644 index a6c76f6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectEventListAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.TaskRecordModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - -class InspectEventListAdapter( - context: Context, private val dataRows: List -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_inspect_rv, parent, false) - ) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.inspectMsgView.text = rowsBean.name - holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") - holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - holder.itemView.setOnClickListener { - listener?.onClick(position) - } - } - - override fun getItemCount(): Int = dataRows.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt deleted file mode 100644 index 8091fca..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.casic.birmm.inspect.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.casic.birmm.inspect.R -import com.casic.birmm.inspect.model.InspectListModel -import com.qmuiteam.qmui.widget.QMUIRadiusImageView - - -class InspectListAdapter( - context: Context, - dataRows: MutableList -) : RecyclerView.Adapter() { - - private val dataRows: MutableList? = dataRows - private var layoutInflater: LayoutInflater? = null - - init { - layoutInflater = LayoutInflater.from(context) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val view: View = - layoutInflater!!.inflate(R.layout.item_inspect_rv, parent, false) - return ItemViewHolder(view) - } - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows?.get(position)!! - holder.inspectMsgView.text = rowsBean.name -// holder.inspectTypeView.text = String.format("类型:${rowsBean.type}") -// holder.inspectDateView.text = String.format("上报时间:${rowsBean.createTime}") - //绑定事件 - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClick(position) - } - } - } - - override fun getItemCount(): Int = dataRows!!.size - - class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var inspectImageView: QMUIRadiusImageView = view.findViewById(R.id.inspectImageView) - var inspectMsgView: TextView = view.findViewById(R.id.inspectMsgView) - var inspectTypeView: TextView = view.findViewById(R.id.inspectTypeView) - var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) - } - - private var listener: OnItemClickListener? = null - - interface OnItemClickListener { - fun onClick(position: Int) - } - - fun setOnItemClickListener(onClickListener: OnItemClickListener?) { - listener = onClickListener - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt deleted file mode 100644 index 9affee1..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * 普通页面的基础类 - * */ -abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - /** - * 初始化xml布局 - */ - abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - /** - * 取消协程 - * */ - override fun onDestroy() { - cancel() - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt index 7099c3d..37f7d02 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseApplication.kt @@ -10,16 +10,16 @@ class BaseApplication : Application() { companion object { - private var instance: BaseApplication by Delegates.notNull() + private var application: BaseApplication by Delegates.notNull() + + fun get() = application private lateinit var daoSession: DaoSession - - fun obtainInstance() = instance } override fun onCreate() { super.onCreate() - instance = this + application = this SaveKeyValues.initSharedPreferences(this) initDataBase() } diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt deleted file mode 100644 index 01b9aae..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.base - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.pengxh.kt.lite.vm.LoadState - -abstract class BaseViewModel : ViewModel() { - val loadState = MutableLiveData() -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt deleted file mode 100644 index ce242a2..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.casic.birmm.inspect.base - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.qmuiteam.qmui.util.QMUIStatusBarHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -/** - * MV ViewModel 架构 - * - * 单个网络请求页面的基础类 - */ -abstract class BaseViewModelActivity : AppCompatActivity(), - CoroutineScope by MainScope() { - - protected lateinit var viewModel: VM - - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - - /** - * 初始化xml布局 - */ - protected abstract fun initLayoutView(): Int - - /** - * 特定页面定制沉浸式状态栏 - */ - protected abstract fun setupTopBarLayout() - - /** - * 初始化默认数据 - */ - abstract fun initData() - - /** - * 初始化业务逻辑 - */ - abstract fun initEvent() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(initLayoutView()) - createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } - QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 - setupTopBarLayout() - initData() - initEvent() - } - - override fun onDestroy() { - cancel()// 取消协程 - super.onDestroy() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt new file mode 100644 index 0000000..6664411 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/Activity.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import android.app.Activity +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px + +fun Activity.showDatePicker(start: DateEntity, callback: DateSelectedCallback) { + val datePicker = DatePicker(this) + + val layout = datePicker.wheelLayout + layout.setDateMode(DateMode.YEAR_MONTH_DAY) + layout.setDateLabel("年", "月", "日"); + layout.setTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextSize(16f.sp2px(this).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + layout.setRange( + start, + DateEntity.target(2050, 12, 31), + DateEntity.today() + ) + + datePicker.setOnDatePickedListener { year, month, day -> + callback.onDateSelected(String.format("%s-%s-%s", year, month, day)) + } + datePicker.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt index f2065dc..8581853 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -1,17 +1,15 @@ package com.casic.birmm.inspect.extensions import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.DeviceDataModel import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.util.* -import java.util.regex.Pattern /** * String扩展方法 @@ -22,18 +20,6 @@ return this + System.currentTimeMillis() + Random().nextInt(999).toString(3) } -//过滤空格,回车 -fun String.filterString(): String { - if (this.isEmpty()) return this - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(this) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") -} - //拼接图片地址 fun String.combineImagePath(): String { if (this.isEmpty()) return this @@ -44,68 +30,27 @@ return "$defaultValue/static/${this.replace("\\", "/")}" } - -//将Toast扩展到String -fun String.show(context: Context) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = this - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() -} - -//判断是否是数字和字母 -fun String.isLetterAndDigit(): Boolean { - var isDigit = false - var isLetter = false - for (i in this.indices) { - if (Character.isDigit(this[i])) { - isDigit = true - } else if (Character.isLetter(this[i])) { - isLetter = true +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(context.createCompressImageDir().toString()) + .filter { + !(it.isBlank() || it.lowercase(Locale.getDefault()).endsWith(".gif")) } - } - return isDigit && isLetter -} + .setCompressListener(object : OnCompressListener { + override fun onStart() { -/** - * 判断是否只包含数字 - * - * Returns whether the given CharSequence contains only digits. - * */ -fun String.isDigitOnly(): Boolean { - val len = this.length - var cp: Int - var i = 0 - while (i < len) { - cp = Character.codePointAt(this, i) - if (!Character.isDigit(cp)) { - return false - } - i += Character.charCount(cp) - } - return true -} + } -fun String.isPhoneNumber(): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (this.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(this).matches() - } + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } //蓝牙数据解析 diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt deleted file mode 100644 index 04bc97c..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.extensions - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 7707ebe..20fd6c3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -19,9 +19,9 @@ } private var inspectionDao: InspectionLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().inspectionLocalBeanDao + BaseApplication.get().obtainDaoSession().inspectionLocalBeanDao private var taskEventDao: TaskEventLocalBeanDao = - BaseApplication.obtainInstance().obtainDaoSession().taskEventLocalBeanDao + BaseApplication.get().obtainDaoSession().taskEventLocalBeanDao /** * 保存巡检记录到本地 diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt deleted file mode 100644 index 335f3ec..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/FileUtils.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.os.Environment -import android.util.Log -import com.casic.birmm.inspect.base.BaseApplication -import com.casic.birmm.inspect.utils.callback.IDownloadListener -import okhttp3.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.text.SimpleDateFormat -import java.util.* - -object FileUtils { - private const val Tag = "FileUtils" - private val context = BaseApplication.obtainInstance() - private var index = 1 - - val imageCompressPath: String - get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") - if (!imageDir.exists()) { - imageDir.mkdir() - } - return imageDir.toString() - } - - //储存下载文件的目录 - private val downloadFilePath: String - get() { - val downloadDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "") - if (!downloadDir.exists()) { - downloadDir.mkdir() - } - return downloadDir.toString() - } - - val documentFile: File - get() { - val documentDir = File( - context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "" - ) - //以天区分名字 - val timeStamp = SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date()) - val logFile = - File(documentDir.toString() + File.separator + "Log_" + timeStamp + ".txt") - if (!logFile.exists()) { - try { - logFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return logFile - } - - val waterImageFile: File - get() { - val waterImageDir = - File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "WaterImage") - if (!waterImageDir.exists()) { - val mkdir = waterImageDir.mkdir() - if (mkdir) { - Log.d(Tag, "创建WaterImage文件夹") - } - } - val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(Date()) - //index用来区分for循环太快会导致多想图片覆盖压缩问题 - val imageFile = - File(waterImageDir.toString() + File.separator + "IMG_" + timeStamp + "_" + (index++) + ".png") - if (!imageFile.exists()) { - try { - imageFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - return imageFile - } - - fun downloadFile(url: String, listener: IDownloadListener) { - val okHttpClient = OkHttpClient() - val request = Request.Builder().get().url(url).build() - okHttpClient.newCall(request).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - var inputStream: InputStream? = null - val buf = ByteArray(2048) - var len: Int - var fos: FileOutputStream? = null - val savePath = downloadFilePath - try { - val body = response.body - if (body != null) { - inputStream = body.byteStream() - val total = body.contentLength() - listener.onDownloadStart(total) - val file = File(savePath, url.substring(url.lastIndexOf("/") + 1)) - fos = FileOutputStream(file) - var current: Long = 0 - while (inputStream.read(buf).also { len = it } != -1) { - fos.write(buf, 0, len) - current += len.toLong() - listener.onProgressChanged(current) - } - fos.flush() - listener.onDownloadEnd(file) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - inputStream?.close() - } catch (e: IOException) { - e.printStackTrace() - } - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt index 6a68178..a5d5d0f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/GlideLoadEngine.kt @@ -2,76 +2,89 @@ import android.content.Context import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.widget.ImageView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.annotation.Nullable import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.BitmapImageViewTarget +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.casic.birmm.inspect.R import com.luck.picture.lib.engine.ImageEngine -import com.luck.picture.lib.listener.OnImageCompleteCallback -import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView +import com.luck.picture.lib.interfaces.OnCallbackListener +import com.luck.picture.lib.utils.ActivityCompatHelper class GlideLoadEngine private constructor() : ImageEngine { companion object { - private var instance: GlideLoadEngine? = null - fun createGlideEngine(): GlideLoadEngine? { - if (null == instance) { - synchronized(GlideLoadEngine::class.java) { - if (null == instance) { - instance = GlideLoadEngine() - } - } - } - return instance + val instance: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + GlideLoadEngine() } } override fun loadImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).load(url).into(imageView) + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context).load(url).into(imageView); } - override fun loadImage( + override fun loadImageBitmap( context: Context, url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView, - callback: OnImageCompleteCallback + maxWidth: Int, + maxHeight: Int, + call: OnCallbackListener? ) { - - } - - override fun loadImage( - context: Context, - url: String, - imageView: ImageView, - longImageView: SubsamplingScaleImageView - ) { - } - - override fun loadFolderImage(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } Glide.with(context) .asBitmap() + .override(maxWidth, maxHeight) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) - .into(object : BitmapImageViewTarget(imageView) { - override fun setResource(resource: Bitmap?) { - val circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(context.resources, resource) - circularBitmapDrawable.cornerRadius = 8f - imageView.setImageDrawable(circularBitmapDrawable) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, @Nullable transition: Transition? + ) { + call?.onCall(resource) } + + override fun onLoadFailed(@Nullable errorDrawable: Drawable?) { + call?.onCall(null) + } + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} }) } - override fun loadAsGifImage(context: Context, url: String, imageView: ImageView) { - Glide.with(context).asGif().load(url).into(imageView) + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(CenterCrop(), RoundedCorners(8)) + .placeholder(R.mipmap.load_image_error) + .into(imageView) + } + + override fun pauseRequests(context: Context?) { + context?.let { Glide.with(it).pauseRequests() } + } + + override fun resumeRequests(context: Context?) { + context?.let { Glide.with(it).resumeRequests() } } override fun loadGridImage(context: Context, url: String, imageView: ImageView) { Glide.with(context) .load(url) - .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder)) + .apply(RequestOptions().placeholder(R.mipmap.load_image_error)) .into(imageView) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt deleted file mode 100644 index 06c30aa..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LogToFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.casic.birmm.inspect.utils - -import java.io.* - - -/** - * 将Log日志写入文件中 - * */ -object LogToFile { - /** - * @param file 待写入的文件 - * @param log 待写入的内容 - */ - fun write(file: File?, log: String?) { - try { - val bufferedWriter = BufferedWriter(FileWriter(file, true)) - bufferedWriter.write(log) - bufferedWriter.newLine() //换行 - bufferedWriter.flush() - bufferedWriter.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - - fun read(file: File?): String? { - val builder: StringBuilder - try { - val bufferedReader = BufferedReader(FileReader(file)) - var line: String? = bufferedReader.readLine() - builder = StringBuilder() - while (line != null) { - builder.append(line) - builder.append("\n") - line = bufferedReader.readLine() - } - bufferedReader.close() - return builder.toString() - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt deleted file mode 100644 index 5fc7121..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build - -object OtherUtils { - fun playSound(context: Context?, resId: Int) { - if (context == null) return - val soundPool = if (Build.VERSION.SDK_INT >= 21) { - val builder = SoundPool.Builder() - builder.setMaxStreams(1) - val attrBuilder = AudioAttributes.Builder() - attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) - builder.setAudioAttributes(attrBuilder.build()) - builder.build() - } else { - SoundPool(1, AudioManager.STREAM_SYSTEM, 5) - } - if (resId == 0) { - soundPool.autoPause() - } else { - soundPool.load(context, resId, 1) - soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> - it.play(1, 1f, 1f, 0, 0, 1f) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt new file mode 100644 index 0000000..3fae4eb --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/SoundPoolUtil.kt @@ -0,0 +1,26 @@ +package com.casic.birmm.inspect.utils + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool + +object SoundPoolUtil { + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + val soundPool = builder.build() + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt new file mode 100644 index 0000000..e3ae821 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/DateSelectedCallback.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.utils.callback + +interface DateSelectedCallback { + fun onDateSelected(date: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt deleted file mode 100644 index a3d49d6..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/callback/IDownloadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.birmm.inspect.utils.callback - -import java.io.File - -interface IDownloadListener { - fun onDownloadStart(totalBytes: Long) - fun onProgressChanged(currentBytes: Long) - fun onDownloadEnd(file: File?) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..112238b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.birmm.inspect.utils.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 6b22ce0..242a490 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -5,10 +5,6 @@ import retrofit2.http.* -/** - * @JvmSuppressWildcards 用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符 - * */ -@JvmSuppressWildcards interface RetrofitService { /** * PublicKey校验 diff --git a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt index c5dbbf7..42eb33f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -11,26 +11,28 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : BaseActivity() { +class BigImageActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_big_image override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) ImmersionBar.with(this).statusBarDarkFont(false).init() } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt index f74f71d..981267a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -3,29 +3,31 @@ import android.annotation.SuppressLint import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity import com.casic.birmm.inspect.extensions.combineImagePath -import com.casic.birmm.inspect.extensions.show import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter +import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class EventDetailActivity : BaseActivity() { +class EventDetailActivity : KotlinBaseActivity() { override fun initLayoutView(): Int = R.layout.activity_event_detail override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件详情" } + override fun observeRequestState() { + + } + @SuppressLint("SetTextI18n") override fun initData() { createTimeView.text = intent.getStringExtra("createTime") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt index f2a84e5..10203ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventListActivity.kt @@ -3,27 +3,27 @@ import android.content.Intent import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.vm.TaskRecordViewModel 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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_event_list.* import kotlinx.android.synthetic.main.include_base_title.* -class EventListActivity : BaseViewModelActivity() { - override fun createViewModelByClass(): Class? = - TaskRecordViewModel::class.java +class EventListActivity : KotlinBaseActivity() { + + private lateinit var taskViewModel: TaskRecordViewModel override fun initLayoutView(): Int = R.layout.activity_event_list override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件清单" @@ -31,40 +31,59 @@ override fun initData() { val id = intent.getStringExtra("id")!! - viewModel.searchByInspection(inspectionId = id) - viewModel.resultModel.observe(this, Observer { + + taskViewModel = ViewModelProvider(this)[TaskRecordViewModel::class.java] + taskViewModel.searchByInspection(inspectionId = id) + taskViewModel.resultModel.observe(this, Observer { if (it.code == 200) { if (it.data!!.list!!.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, it.data!!.list!!) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) + val eventAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, + it.data!!.list!! + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: TaskRecordModel.DataBean.ListBean + ) { val intent = Intent(this@EventListActivity, EventDetailActivity::class.java) - val listBean = it.data!!.list!![position] - intent.putExtra("createTime", listBean.createTime) + intent.putExtra("createTime", t.createTime) intent.putExtra( - "description", - listBean.description!!.filterString() + "description", t.description!!.filterSpaceOrEnter() ) - intent.putExtra("data", listBean.data) - intent.putExtra("images", listBean.images) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) } } }) - viewModel.loadState.observe(this, Observer { - "未知异常,暂时无法查看清单".show(this) - }) } override fun initEvent() { leftBackView.setOnClickListener { this.finish() } } + + override fun observeRequestState() { + taskViewModel.loadState.observe(this) { + "未知异常,暂时无法查看清单".show(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt index ab3a2ac..96214d9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -3,23 +3,23 @@ import android.content.Context import android.content.Intent import android.os.Handler +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.EventListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.filterSpaceOrEnter +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.endDateView @@ -29,7 +29,7 @@ import kotlinx.android.synthetic.main.activity_query_inspect.startDateView import kotlinx.android.synthetic.main.include_base_title.* -class EventQueryActivity : BaseViewModelActivity() { +class EventQueryActivity : KotlinBaseActivity() { private val context: Context = this@EventQueryActivity private var keywords = "" @@ -40,15 +40,12 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: EventListAdapter - - override fun createViewModelByClass(): Class = - EventQueryViewModel::class.java + private lateinit var eventListAdapter: NormalRecyclerAdapter + private lateinit var eventViewModel: EventQueryViewModel override fun initLayoutView(): Int = R.layout.activity_query_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "事件查询" @@ -56,84 +53,9 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryEvent( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - viewModel.resultModel.observe(this, Observer { + eventViewModel = ViewModelProvider(this)[EventQueryViewModel::class.java] + eventViewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows when { @@ -158,7 +80,67 @@ weakReferenceHandler.sendEmptyMessage(20210712) } }) - viewModel.loadState.observe(this, Observer { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + + startDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + getEventList() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getEventList() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getEventList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getEventList() + } + + + private fun getEventList() { + eventViewModel.queryEvent( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) + } + + override fun observeRequestState() { + eventViewModel.loadState.observe(this, Observer { "抱歉,无法查询到相关记录".show(this) }) } @@ -166,26 +148,45 @@ private val callback = Handler.Callback { if (it.what == 20210712) { if (isRefresh || isLoadMore) { - adapter.notifyDataSetChanged() + eventListAdapter.notifyDataSetChanged() } else { //首次加载数据 if (dataBeans.size == 0) { emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = EventListAdapter(this, dataBeans) - eventRecyclerView!!.layoutManager = LinearLayoutManager(this) - eventRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val intent = Intent(context, EventDetailActivity::class.java) - val rowsBean = dataBeans[position] - intent.putExtra("createTime", rowsBean.createTime) - intent.putExtra( - "description", rowsBean.description!!.filterString() + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" ) - intent.putExtra("data", rowsBean.data) - intent.putExtra("images", rowsBean.images) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } + eventRecyclerView!!.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { + val intent = Intent(context, EventDetailActivity::class.java) + intent.putExtra("createTime", t.createTime) + intent.putExtra("description", t.description!!.filterSpaceOrEnter()) + intent.putExtra("data", t.data) + intent.putExtra("images", t.images) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index 45a9a62..86f7209 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -1,12 +1,10 @@ package com.casic.birmm.inspect.view import android.os.CountDownTimer -import android.view.ViewGroup.MarginLayoutParams import com.casic.birmm.inspect.R import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.activity_guide.* class GuideActivity : KotlinBaseActivity() { @@ -17,14 +15,6 @@ override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() - //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) - val rightMargin = QMUIDisplayHelper.dp2px(this, 10) - if (skipButton.layoutParams is MarginLayoutParams) { - val params = skipButton.layoutParams as MarginLayoutParams - params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) - skipButton.requestLayout() - } } override fun initData() { @@ -52,4 +42,8 @@ navigatePageTo() finish() } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 1a9c11e..8f58b40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -5,26 +5,26 @@ import android.os.Handler import androidx.core.content.ContextCompat import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.model.InspectListModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity import com.gyf.immersionbar.ImmersionBar -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.timestampToDate +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.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_inspect.* import kotlinx.android.synthetic.main.include_base_title.* -class InspectionQueryActivity : BaseViewModelActivity() { +class InspectionQueryActivity : KotlinBaseActivity() { private val context: Context = this@InspectionQueryActivity private var keywords = "" @@ -35,15 +35,18 @@ private var isLoadMore = false private var dataBeans: MutableList = ArrayList() private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var adapter: InspectListAdapter + private lateinit var adapter: NormalRecyclerAdapter + private lateinit var viewModel: InspectionQueryViewModel - override fun createViewModelByClass(): Class? = - InspectionQueryViewModel::class.java + override fun observeRequestState() { + viewModel.loadState.observe(this) { + "抱歉,无法查询到相关记录".show(this) + } + } override fun initLayoutView(): Int = R.layout.activity_query_inspect override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "巡检记录查询" @@ -51,83 +54,8 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - //开始时间 - startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(supportFragmentManager, "startDate") - } - //结束时间 - endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(supportFragmentManager, "startDate") - } - - //开始搜索 - searchView.setOnClickListener { - keywords = inputTipsView.text.toString() - //查询都从第一页开始查 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - - refreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } - refreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - viewModel.queryInspect( - keywords = keywords, - startTime = startTime, - endTime = endTime, - pageIndex = pageIndex - ) - } + viewModel = ViewModelProvider(this)[InspectionQueryViewModel::class.java] viewModel.resultModel.observe(this, Observer { if (it.code == 200) { val dataRows = it.data?.rows @@ -153,9 +81,64 @@ weakReferenceHandler.sendEmptyMessage(20210709) } }) - viewModel.loadState.observe(this, Observer { - "抱歉,无法查询到相关记录".show(this) - }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) + } + //结束时间 + endDateView.setOnClickListener { + showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 + queryInspect() + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + queryInspect() + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + queryInspect() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + queryInspect() + } + + private fun queryInspect() { + viewModel.queryInspect( + keywords = keywords, + startTime = startTime, + endTime = endTime, + pageIndex = pageIndex + ) } private val callback = Handler.Callback { @@ -167,14 +150,30 @@ emptyView!!.show("抱歉,无法查询到相关记录", null) } else { emptyView!!.hide() - adapter = InspectListAdapter(this, dataBeans) + adapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView!!.layoutManager = LinearLayoutManager(this) inspectRecyclerView!!.adapter = adapter - adapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + adapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { val intent = Intent(context, InspectRouteActivity::class.java) - intent.putExtra("id", dataBeans[position].id) + intent.putExtra("id", t.id) startActivity(intent) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 599917a..0c79746 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -7,14 +7,15 @@ import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.view.single.SingleMainActivity +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.RSAUtils import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -25,6 +26,10 @@ private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginInViewModel: LoginInViewModel + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -71,7 +76,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!! /** @@ -94,22 +99,22 @@ finish() } }) - loginInViewModel.loadState.observe(this, { loginState -> + loginInViewModel.loadState.observe(this) { loginState -> changeLoadStatus(loginState) - }) + } } else { it.message!!.show(this) } - }) - authenticateViewModel.loadState.observe(this, { + } + authenticateViewModel.loadState.observe(this) { changeLoadStatus(it) - }) + } //单机模式 - singleModeView.setOnClickListener { - navigatePageTo() - finish() - } +// singleModeView.setOnClickListener { +// navigatePageTo() +// finish() +// } //修改服务器配置 changeServerConfigView.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 5cf33d9..2e95f2b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -6,34 +6,36 @@ import android.view.KeyEvent import android.view.View import androidx.core.content.ContextCompat -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.vm.UserViewModel import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* -class MainActivity : BaseActivity() { +class MainActivity : KotlinBaseActivity() { private var clickTime: Long = 0 private val itemList: List = arrayListOf("巡检记录", "事件记录") + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -56,15 +58,12 @@ } private fun obtainUserInfo() { - val userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] userViewModel.getUserInfo() - userViewModel.resultModel.observe(this, Observer { + userViewModel.resultModel.observe(this) { if (it.code == 200) { //记录登录log - LogToFile.write( - FileUtils.documentFile, - System.currentTimeMillis().timestampToCompleteDate() + " ${it.data!!.name}登录成功" - ) + "${it.data!!.name}登录成功".writeToFile(createLogFile()) SaveKeyValues.putValue(LocaleConstant.USER_OBJECT, Gson().toJson(it))//保存用户对象 } else { AlertControlDialog.Builder() @@ -84,7 +83,7 @@ } }).build().show() } - }) + } } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt index faf10fc..30c97fc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -23,11 +23,17 @@ import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.BLEManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.utils.callback.OnBleConnectListener import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener import com.casic.birmm.inspect.vm.AddInspectionViewModel @@ -35,6 +41,7 @@ import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil @@ -507,7 +514,7 @@ if (mapActivity.isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(mapActivity, R.raw.alarm) + SoundPoolUtil.playSound(mapActivity, R.raw.alarm) mapActivity.vibrator.vibrate(1000) if (mapActivity.isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -518,7 +525,7 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(mapActivity, 0) + SoundPoolUtil.playSound(mapActivity, 0) } } else { Log.d(Tag, "报警开关未打开,不处理") diff --git a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt index aac5fa6..99b9570 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/NewEventActivity.kt @@ -1,37 +1,53 @@ package com.casic.birmm.inspect.view -import android.app.Activity -import android.content.Intent + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseViewModelActivity -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.GlideLoadEngine +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.OnImageCompressListener import com.casic.birmm.inspect.vm.NewEventViewModel import com.casic.birmm.inspect.vm.UploadImageViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.filterSpaceOrEnter 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.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NewEventActivity : BaseViewModelActivity() { +class NewEventActivity : KotlinBaseActivity() { + private val kTag = "NewEventActivity" + private val context: Context = this@NewEventActivity + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel + private lateinit var viewModel: NewEventViewModel private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 private lateinit var imageAdapter: EditableImageAdapter @@ -44,18 +60,22 @@ private lateinit var type: String private lateinit var userModel: UserInfoModel - override fun createViewModelByClass(): Class = NewEventViewModel::class.java + override fun observeRequestState() { + + } override fun initLayoutView(): Int = R.layout.activity_new_event override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() } override fun initData() { - uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + + viewModel = ViewModelProvider(this)[NewEventViewModel::class.java] + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) isWarning = intent.getBooleanExtra("isWarning", true) @@ -82,7 +102,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(context) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -118,22 +148,22 @@ } } }) - uploadImageViewModel.loadState.observe(this, Observer { + uploadImageViewModel.loadState.observe(this) { DialogHelper.dismissLoadingDialog() - }) + } addEventButton.setOnClickListener { - if (eventEditTextView.text.toString().filterString().isEmpty()) { + if (eventEditTextView.text.toString().isBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isEmpty()) { + if (inspectNumberView.text.toString().isBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -149,7 +179,7 @@ lat = latitude, data = data, images = imagePaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString().filterSpaceOrEnter(), user = user ) } @@ -171,55 +201,108 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@NewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@NewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + result[0].realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d( + "Casic", "EntrustAddActivity => onSuccess: ${file.absolutePath}" + ) + ///storage/emulated/0/Android/data/com.casic.xz.meterage/files/Pictures/CompressImage/1677478115391211.jpeg + //上传图片 + uploadImageViewModel.uploadImage(image = file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } - }).build().show() + + override fun onCancel() { + + } + }) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") - for (res in selectResult) { - val file = File(res.compressPath) - //上传图片 - uploadImageViewModel.uploadImage(image = file) + private fun takePicture() { + PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(context) + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022062901 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] - //上传图片 - uploadImageViewModel.uploadImage(image = File(cameraResult.compressPath)) + + override fun onCancel() { + } - } + }) + } + + private val callback = Handler.Callback { + if (it.what == 2022062901) { + analyticalSelectResults(it.obj as LocalMedia) } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt index b64ad1c..55d2f8a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -2,27 +2,30 @@ import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.FileUtils -import com.casic.birmm.inspect.utils.LogToFile import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.createLogFile +import com.pengxh.kt.lite.extensions.read import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_show_log.* import kotlinx.android.synthetic.main.include_base_title.* -class ShowLogActivity : BaseActivity() { +class ShowLogActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "日志" } + override fun observeRequestState() { + + } + override fun initData() { - userLoginLogView.text = LogToFile.read(FileUtils.documentFile) + userLoginLogView.text = createLogFile().read() } override fun initEvent() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 7c39937..127050d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -8,13 +8,15 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.vm.LoginOutViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues @@ -22,19 +24,22 @@ import kotlinx.android.synthetic.main.activity_user_settings.* import kotlinx.android.synthetic.main.include_base_title.* -class UserSettingsActivity : BaseActivity() { +class UserSettingsActivity : KotlinBaseActivity() { private lateinit var vibrator: Vibrator override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { - PageNavigationManager.addActivity(this) ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" } + override fun observeRequestState() { + + } + override fun initData() { val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String val userModel = Gson().fromJson(userModelJson, UserInfoModel::class.java) @@ -65,10 +70,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(this, R.raw.alarm) + SoundPoolUtil.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(this, 0) + SoundPoolUtil.playSound(this, 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt index 8510c31..5742cf8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventDetailActivity.kt @@ -2,13 +2,13 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity 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.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_detail.* @@ -65,4 +65,8 @@ override fun initEvent() { } + + override fun observeRequestState() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt index 31f0f48..35bf2e4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleEventListActivity.kt @@ -2,15 +2,17 @@ import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectEventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.DataBaseManager 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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_event_list.* @@ -30,24 +32,39 @@ titleView.text = "事件清单" } + override fun observeRequestState() { + + } + override fun initData() { val id = intent.getStringExtra(Constant.INTENT_PARAM)!! val dataRows = DataBaseManager.instance.queryTaskByInspection(id) if (dataRows.isEmpty()) { "抱歉,无法查询到相关记录".show(this) } else { - val eventAdapter = InspectEventListAdapter(this, dataRows) + val eventAdapter = object : NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataRows + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: TaskRecordModel.DataBean.ListBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventAdapter - eventAdapter.setOnItemClickListener(object : - InspectEventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataRows[position] + eventAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: TaskRecordModel.DataBean.ListBean) { navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt index 725c22b..2a72ef9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleMainActivity.kt @@ -9,13 +9,13 @@ import androidx.viewpager.widget.ViewPager import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.ViewPagerAdapter -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.view.single.fragment.InspectPageFragment import com.casic.birmm.inspect.view.single.fragment.LogRecordPageFragment import com.casic.birmm.inspect.view.single.fragment.SettingsPageFragment import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_single_main.* @@ -33,6 +33,10 @@ fragmentPages.add(SettingsPageFragment()) } + override fun observeRequestState() { + + } + override fun initLayoutView(): Int = R.layout.activity_single_main override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt index 489c532..7550c0d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/SingleNewEventActivity.kt @@ -1,26 +1,21 @@ package com.casic.birmm.inspect.view.single -import android.app.Activity -import android.content.Intent -import android.graphics.Color import android.view.View import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.filterString import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.reformat -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.GlideLoadEngine import com.casic.birmm.inspect.view.BigImageActivity import com.gyf.immersionbar.ImmersionBar -import com.luck.picture.lib.PictureSelector -import com.luck.picture.lib.config.PictureConfig -import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +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.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_new_event.* @@ -47,6 +42,10 @@ ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } + override fun observeRequestState() { + + } + override fun initData() { isWarning = intent.getBooleanExtra("isWarning", true) inspectionId = intent.getStringExtra("inspectionId")!! @@ -72,7 +71,17 @@ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + BottomActionSheet.Builder() + .setContext(this@SingleNewEventActivity) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> selectPicture() + 1 -> takePicture() + } + } + }).build().show() } override fun onItemClick(position: Int) { @@ -90,17 +99,17 @@ addEventButton.setOnClickListener { this.taskId = "t".id() - if (eventEditTextView.text.toString().filterString().isBlank()) { + if (eventEditTextView.text.isNullOrBlank()) { "事件情况说明还未填写,请检查".show(this) return@setOnClickListener } if (isWarning) { - if (inspectNumberView.text.toString().filterString().isBlank()) { + if (inspectNumberView.text.isNullOrBlank()) { "最大泄露值还未填写,请检查".show(this) return@setOnClickListener } type = "报警事件" - data = inspectNumberView.text.toString().filterString().toDouble() + data = inspectNumberView.text.toString().filterSpaceOrEnter().toDouble() } else { type = "自定义事件" } @@ -115,7 +124,7 @@ lat = latitude, data = data, images = realPaths.reformat(), - description = eventEditTextView.text.toString().filterString(), + description = eventEditTextView.text.toString(), user = resources.getString(R.string.app_name) ) ) @@ -127,57 +136,53 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openCamera(PictureMimeType.ofImage()) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .forResult(PictureConfig.REQUEST_CAMERA) - } - 1 -> { - PictureSelector.create(this@SingleNewEventActivity) - .openGallery(PictureMimeType.ofImage()) - .isWeChatStyle(true) - .isCamera(false) - .isCompress(true) - .compressSavePath(FileUtils.imageCompressPath) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(3) - .forResult(PictureConfig.CHOOSE_REQUEST) - } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return } - } - }).build().show() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) { - when (requestCode) { - PictureConfig.CHOOSE_REQUEST -> { - val selectResult = PictureSelector.obtainMultipleResult(data) - for (res in selectResult) { + for (res in result) { realPaths.add(res.compressPath) } } - PictureConfig.REQUEST_CAMERA -> { - val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + + override fun onCancel() { + + } + }) + } + + private fun takePicture() { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(this@SingleNewEventActivity) + return + } + val cameraResult = result[0] realPaths.add(cameraResult.compressPath) } - } - /** - * 显示图片 - * path: /storage/emulated/0/Android/data/com.casic.birmm.inspect/files/Pictures/IMG_CMP_53734632.jpeg - * */ - imageAdapter.setupImage(realPaths) - } + + override fun onCancel() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt index da52201..30f5f34 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/EventListFragment.kt @@ -2,22 +2,22 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat +import android.util.Log import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.EventListAdapter import com.casic.birmm.inspect.extensions.addAll -import com.casic.birmm.inspect.extensions.filterString -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleEventDetailActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.filterSpaceOrEnter import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.activity_query_event.* import kotlinx.android.synthetic.main.activity_query_inspect.emptyView @@ -30,7 +30,7 @@ class EventListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var eventListAdapter: EventListAdapter + private lateinit var eventListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -51,6 +51,10 @@ weakReferenceHandler = WeakReferenceHandler(callback) } + override fun observeRequestState() { + + } + override fun onResume() { dataBeans = DataBaseManager.instance.queryAllTaskEvent(pageIndex) weakReferenceHandler.sendEmptyMessage(20210820) @@ -59,35 +63,21 @@ override fun initEvent() { startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } searchView.setOnClickListener { @@ -159,18 +149,40 @@ } } else { emptyView!!.hide() - eventListAdapter = EventListAdapter(requireContext(), dataBeans) + eventListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: EventListModel.DataBean.RowsBean + ) { + val imageArray = item.images?.split(",") + Log.d( + "Casic", + "EventListFragment => convertView: ${imageArray?.get(0)}" + ) +// viewHolder.setImageResource(R.id.inspectImageView,imageArray?.get(0)) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectMsgView, "类型:${item.type}") + .setText(R.id.inspectMsgView, "上报时间:${item.createTime}") + } + } eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickListener(object : - EventListAdapter.OnItemClickListener { - override fun onClick(position: Int) { - val rowsBean = dataBeans[position] + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( addAll( - rowsBean.createTime.toString(), - rowsBean.description!!.filterString(), - rowsBean.data.toString(), - rowsBean.images.toString() + t.createTime.toString(), + t.description!!.filterSpaceOrEnter(), + t.data.toString(), + t.images.toString() ) ) } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt index 615c394..ed32ab8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectListFragment.kt @@ -2,27 +2,26 @@ import android.os.CountDownTimer import android.os.Handler -import androidx.core.content.ContextCompat import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.adapter.InspectListAdapter -import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.extensions.showDatePicker import com.casic.birmm.inspect.extensions.showEmptyPage import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.DataBaseManager -import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.callback.DateSelectedCallback import com.casic.birmm.inspect.view.single.SingleInspectRouteActivity -import com.jzxiang.pickerview.TimePickerDialog -import com.jzxiang.pickerview.data.Type +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +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.timestampToDate +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.fragment_inspect_list.* class InspectListFragment : KotlinBaseFragment() { private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var inspectListAdapter: InspectListAdapter + private lateinit var inspectListAdapter: NormalRecyclerAdapter //本地数据库页码从0开始 private var pageIndex = 0 @@ -39,6 +38,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) } @@ -52,35 +55,22 @@ override fun initEvent() { //开始时间 startDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择起始时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - startTime = millsSeconds.timestampToDate() - startDateView.setText(startTime) - } - .build().show(childFragmentManager, "startDate") + requireActivity().showDatePicker( + DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + startDateView.setText(date) + } + }) } //结束时间 endDateView.setOnClickListener { - TimePickerDialog.Builder() - .setThemeColor(ContextCompat.getColor(requireContext(), R.color.mainThemeColor)) - .setTitleStringId("请选择结束时间") - .setWheelItemTextSize(16) - .setCyclic(false) - .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) - .setMaxMillseconds(System.currentTimeMillis()) - .setType(Type.YEAR_MONTH_DAY) - .setCallBack { _, millsSeconds -> - endTime = millsSeconds.timestampToDate() - endDateView.setText(endTime) - } - .build().show(childFragmentManager, "endDate") + requireActivity().showDatePicker(DateEntity.target(1949, 10, 1), + object : DateSelectedCallback { + override fun onDateSelected(date: String) { + endDateView.setText(date) + } + }) } //开始搜索 @@ -152,13 +142,29 @@ } } else { emptyView!!.hide() - inspectListAdapter = InspectListAdapter(requireContext(), dataBeans) + inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: InspectListModel.DataBean.RowsBean + ) { + viewHolder.setText(R.id.inspectMsgView, item.name) +// .setText(R.id.inspectTypeView,"类型:${item.type}") + .setText(R.id.inspectDateView, "上报时间:${item.date}") + } + } inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickListener(object : - InspectListAdapter.OnItemClickListener { - override fun onClick(position: Int) { + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: InspectListModel.DataBean.RowsBean + ) { requireContext().navigatePageTo( - dataBeans[position].id.toString() + t.id.toString() ) } }) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt index 3a8062d..51248fa 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/InspectPageFragment.kt @@ -21,20 +21,28 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.bean.BlueToothBean -import com.casic.birmm.inspect.extensions.* +import com.casic.birmm.inspect.extensions.id +import com.casic.birmm.inspect.extensions.toDataModel +import com.casic.birmm.inspect.extensions.toDeviceCode +import com.casic.birmm.inspect.extensions.toHexString import com.casic.birmm.inspect.model.NewInspectionModel import com.casic.birmm.inspect.model.NewRouteModel import com.casic.birmm.inspect.model.NewTaskEventModel -import com.casic.birmm.inspect.utils.* -import com.casic.birmm.inspect.utils.callback.OnBleConnectListener -import com.casic.birmm.inspect.utils.callback.OnDeviceSearchListener +import com.casic.birmm.inspect.utils.DataBaseManager +import com.casic.birmm.inspect.utils.DialogHelper +import com.casic.birmm.inspect.utils.LocaleConstant +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.single.SingleNewEventActivity import com.google.gson.Gson +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToDate import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.utils.ble.BLEManager +import com.pengxh.kt.lite.utils.ble.BlueToothBean +import com.pengxh.kt.lite.utils.ble.OnBleConnectListener +import com.pengxh.kt.lite.utils.ble.OnDeviceDiscoveredListener import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -87,8 +95,8 @@ initMap(savedInstanceState) - if (BLEManager.initBle(requireContext())) { - if (!BLEManager.isEnable()) { + if (BLEManager.initBLE(requireContext())) { + if (!BLEManager.isBluetoothEnable()) { BLEManager.openBluetooth(false) } } else { @@ -153,25 +161,20 @@ stopInspection() } }).build().show() + } - //蓝牙按钮 - if (isBluetoothOn) { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - inspectView.bluetoothButton.setOnClickListener { - if (curConnectState) { - //断开连接 - BLEManager.disConnectDevice() - inspectView.currentValueView.text = "--" - inspectView.settingsValueView.text = "--" - inspectView.maxValueView.text = "--" - inspectView.deviceStatusView.text = "设备编号:未连接" - "设备已断开连接".show(requireContext()) - } else { - searchDevice() - } - } + //蓝牙按钮 + inspectView.bluetoothButton.setOnClickListener { + if (curConnectState) { + //断开连接 + BLEManager.disConnectDevice() + inspectView.currentValueView.text = "--" + inspectView.settingsValueView.text = "--" + inspectView.maxValueView.text = "--" + inspectView.deviceStatusView.text = "设备编号:未连接" + "设备已断开连接".show(requireContext()) } else { - inspectView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + searchDevice() } } @@ -330,18 +333,18 @@ private fun searchDevice() { //搜索蓝牙 if (BLEManager.isDiscovery()) {//当前正在搜索设备... - BLEManager.stopDiscoveryDevice() + BLEManager.stopDiscoverDevice() } DialogHelper.showLoadingDialog(requireActivity(), "设备搜索中..."); - BLEManager.startDiscoveryDevice(object : OnDeviceSearchListener { - override fun onDeviceFound(blueToothBean: BlueToothBean) { + BLEManager.startDiscoverDevice(object : OnDeviceDiscoveredListener { + override fun onDeviceFound(blueToothBean: BlueToothBean?) { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_DEVICE message.obj = blueToothBean weakReferenceHandler.sendMessage(message) } - override fun onDiscoveryOutTime() { + override fun onDiscoveryTimeout() { val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.DISCOVERY_OUT_TIME weakReferenceHandler.sendMessage(message) @@ -353,8 +356,7 @@ when (msg.what) { LocaleConstant.BACK_TO_HOME -> { SaveKeyValues.putValue( - LocaleConstant.INSPECTION_OBJECT, - gson.toJson(model) + LocaleConstant.INSPECTION_OBJECT, gson.toJson(model) ) SaveKeyValues.putValue(LocaleConstant.INSPECTION_COMPLETED, false) } @@ -370,23 +372,24 @@ } LocaleConstant.DISCOVERY_DEVICE -> { val bean = msg.obj as BlueToothBean -// if (bean.bluetoothDevice.name.isDigitOnly()) { - if (blueToothBeans.size == 0) { - blueToothBeans.add(bean) - } else { - //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 - var judge = 0 - for (it in blueToothBeans) { - if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { - judge = 1 - break + //过滤摩拜蓝牙 + if (bean.bluetoothDevice.name != "mobike") { + if (blueToothBeans.size == 0) { + blueToothBeans.add(bean) + } else { + //0表示未添加到list的新设备,1表示已经扫描并添加到list的设备 + var judge = 0 + for (it in blueToothBeans) { + if (it.bluetoothDevice.address == bean.bluetoothDevice.address) { + judge = 1 + break + } + } + if (judge == 0) { + blueToothBeans.add(bean) } } - if (judge == 0) { - blueToothBeans.add(bean) - } } -// } } LocaleConstant.DISCOVERY_OUT_TIME -> { DialogHelper.dismissLoadingDialog() @@ -429,12 +432,9 @@ val firstByte = receiveByteArray[0] if (firstByte == 0xAA.toByte()) { //解析测量数据 -// Log.d(Tag, "实际数据: ${receiveByteArray.toList()}") if (receiveByteArray.size == 14) { val dataHexString = receiveByteArray.toHexString() -// Log.d(Tag, "十六进制: $dataHexString") val dataModel = dataHexString.toDataModel() -// Log.d(Tag, "数据模型: ${Gson().toJson(dataModel)}") inspectView.currentValueView.text = dataModel.potency.toString() inspectView.settingsValueView.text = dataModel.alarmValue.toString() inspectView.maxValueView.text = dataModel.maxPotency.toString() @@ -442,7 +442,7 @@ if (isOpenWarning) { if (dataModel.potency >= dataModel.alarmValue) { //当前值大于设置值,需要报警 - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) if (isAutoRecord) { //如果连续超过10个报警,自动生成报警事件 @@ -453,10 +453,8 @@ } } else { //当测量值小于设置值,报警还未结束,需要停止响铃 - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) } - } else { - Log.d(kTag, "报警开关未打开,不处理") } } else { Log.d(kTag, "设备返回值长度异常,无法解析") @@ -622,6 +620,7 @@ aMap = inspectView.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isZoomControlsEnabled = false//不显示地图缩放控制器 uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt index 2a7d58d..2d88438 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/LogRecordPageFragment.kt @@ -8,7 +8,6 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.dp2px import kotlinx.android.synthetic.main.fragment_single_log.* -import java.util.* class LogRecordPageFragment : KotlinBaseFragment() { @@ -25,6 +24,10 @@ } + override fun observeRequestState() { + + } + override fun initData() { val subViewAdapter = SubViewPagerAdapter( childFragmentManager, arrayOf("巡检记录", "事件记录"), viewPages diff --git a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt index 0a35fc0..ef40cb5 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/single/fragment/SettingsPageFragment.kt @@ -4,12 +4,12 @@ import android.os.Vibrator import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.LocaleConstant -import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.SoundPoolUtil import com.casic.birmm.inspect.view.LoginActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_single_settings.* @@ -36,6 +36,10 @@ vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } + override fun observeRequestState() { + + } + override fun initEvent() { warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { @@ -47,10 +51,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, true) - OtherUtils.playSound(requireContext(), R.raw.alarm) + SoundPoolUtil.playSound(requireContext(), R.raw.alarm) vibrator.vibrate(1000) } else { - OtherUtils.playSound(requireContext(), 0) + SoundPoolUtil.playSound(requireContext(), 0) SaveKeyValues.putValue(LocaleConstant.OPEN_WARNING, false) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt index ba97a90..5b3b5ce 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AddInspectionViewModel.kt @@ -1,13 +1,16 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AddInspectionViewModel : BaseViewModel() { + val resultModel = MutableLiveData() fun addInspection( @@ -22,5 +25,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index 4ad1d42..dcade53 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ keyModel.value = RetrofitServiceManager.authenticate() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt index 6264162..e900637 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt @@ -1,20 +1,22 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.EventListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class EventQueryViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = - launch({ - resultModel.value = - RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) - }, { - loadState.value = LoadState.Fail - }) + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt index 9aeadeb..c4b1e0c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectDetailViewModel.kt @@ -1,20 +1,19 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectDetailViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun getInspectDetail(id: String) = - launch({ - resultModel.value = - RetrofitServiceManager.getInspectDetail(id) - }, { - loadState.value = LoadState.Fail - }) + fun getInspectDetail(id: String) = launch({ + resultModel.value = + RetrofitServiceManager.getInspectDetail(id) + }, { + loadState.value = LoadState.Fail + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 97b242f..cfc087d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class InspectionQueryViewModel : BaseViewModel() { @@ -16,5 +18,6 @@ RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index 5e11870..b6a7056 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginInViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index 1c85152..f77cfb1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class LoginOutViewModel : BaseViewModel() { @@ -15,5 +17,6 @@ resultModel.value = RetrofitServiceManager.loginOut() }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt index bd9b386..721ea5e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/NewEventViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class NewEventViewModel : BaseViewModel() { @@ -22,5 +24,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt index 3c478f1..bdbf93a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/TaskRecordViewModel.kt @@ -1,20 +1,21 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.TaskRecordModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class TaskRecordViewModel : BaseViewModel() { val resultModel = MutableLiveData() - fun searchByInspection(inspectionId: String) = - launch({ - resultModel.value = - RetrofitServiceManager.searchByInspection(inspectionId) - }, { - loadState.value = LoadState.Fail - }) + fun searchByInspection(inspectionId: String) = launch({ + resultModel.value = RetrofitServiceManager.searchByInspection(inspectionId) + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt index b6d19ce..1b2a47e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UploadImageViewModel.kt @@ -1,10 +1,12 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch +import com.casic.birmm.inspect.base.BaseApplication import com.casic.birmm.inspect.model.ActionResultModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState import java.io.File @@ -16,5 +18,6 @@ loadState.value = LoadState.Success }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index 6e4f910..030ecd8 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,10 +1,10 @@ package com.casic.birmm.inspect.vm import androidx.lifecycle.MutableLiveData -import com.casic.birmm.inspect.base.BaseViewModel -import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { diff --git a/app/src/main/res/layout/activity_guide.xml b/app/src/main/res/layout/activity_guide.xml index af3d28e..cf9db71 100644 --- a/app/src/main/res/layout/activity_guide.xml +++ b/app/src/main/res/layout/activity_guide.xml @@ -10,10 +10,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" + android:layout_alignParentBottom="true" + android:layout_margin="@dimen/dp_10" android:paddingHorizontal="@dimen/dp_7" android:paddingVertical="@dimen/dp_5" android:text="跳过\u30003" android:textColor="@color/white" app:qmui_backgroundColor="@color/transparentBlack" + app:qmui_borderWidth="0dp" app:qmui_radius="@dimen/dp_5" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index c780a62..dbe28ee 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -95,7 +95,8 @@ android:layout_below="@id/loginButton" android:layout_marginHorizontal="@dimen/dp_50" android:layout_marginTop="@dimen/dp_10" - android:text="单机模式使用" /> + android:text="单机模式使用" + android:visibility="gone" /> + android:scrollbars="none" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />