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