diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt
index eaead98..cd06e07 100644
--- a/app/src/main/java/com/casic/detector/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt
@@ -157,14 +157,6 @@
progressDialog.setCanceledOnTouchOutside(false)
progressDialog.setCancelable(false)
- //协程异步显示默认数据
- CoroutineScope(Dispatchers.Main).launch {
- labelBeans = withContext(Dispatchers.IO) {
- DataBaseManager.get.loadTaskLabels() as ArrayList
- }
- showLabelsOnMap()
- }
-
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
versionViewModel.versionResult.observe(this) {
if (it.version.toInt() > BuildConfig.VERSION_CODE) {
@@ -371,9 +363,9 @@
}
})
- //安装
+ //安装。上传,然后存入本地库
installButton.setOnClickListener {
-
+ navigatePageTo()
}
//查看
@@ -678,6 +670,13 @@
override fun onResume() {
super.onResume()
mapView.onResume()
+ //协程异步显示默认数据
+ CoroutineScope(Dispatchers.Main).launch {
+ labelBeans = withContext(Dispatchers.IO) {
+ DataBaseManager.get.loadTaskLabels() as ArrayList
+ }
+ showLabelsOnMap()
+ }
}
override fun onPause() {
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt
index eaead98..cd06e07 100644
--- a/app/src/main/java/com/casic/detector/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt
@@ -157,14 +157,6 @@
progressDialog.setCanceledOnTouchOutside(false)
progressDialog.setCancelable(false)
- //协程异步显示默认数据
- CoroutineScope(Dispatchers.Main).launch {
- labelBeans = withContext(Dispatchers.IO) {
- DataBaseManager.get.loadTaskLabels() as ArrayList
- }
- showLabelsOnMap()
- }
-
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
versionViewModel.versionResult.observe(this) {
if (it.version.toInt() > BuildConfig.VERSION_CODE) {
@@ -371,9 +363,9 @@
}
})
- //安装
+ //安装。上传,然后存入本地库
installButton.setOnClickListener {
-
+ navigatePageTo()
}
//查看
@@ -678,6 +670,13 @@
override fun onResume() {
super.onResume()
mapView.onResume()
+ //协程异步显示默认数据
+ CoroutineScope(Dispatchers.Main).launch {
+ labelBeans = withContext(Dispatchers.IO) {
+ DataBaseManager.get.loadTaskLabels() as ArrayList
+ }
+ showLabelsOnMap()
+ }
}
override fun onPause() {
diff --git a/app/src/main/res/layout/activity_install_label.xml b/app/src/main/res/layout/activity_install_label.xml
index 06faaeb..10dfdc2 100644
--- a/app/src/main/res/layout/activity_install_label.xml
+++ b/app/src/main/res/layout/activity_install_label.xml
@@ -1,70 +1,113 @@
-
+ android:layout_height="wrap_content"
+ android:background="@color/mainBackground"
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="@dimen/lib_dp_45"
+ android:orientation="horizontal">
-
+
+ android:layout_width="@dimen/lib_px_1"
+ android:layout_height="match_parent"
+ android:background="@color/lib_line_color" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt
index eaead98..cd06e07 100644
--- a/app/src/main/java/com/casic/detector/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt
@@ -157,14 +157,6 @@
progressDialog.setCanceledOnTouchOutside(false)
progressDialog.setCancelable(false)
- //协程异步显示默认数据
- CoroutineScope(Dispatchers.Main).launch {
- labelBeans = withContext(Dispatchers.IO) {
- DataBaseManager.get.loadTaskLabels() as ArrayList
- }
- showLabelsOnMap()
- }
-
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
versionViewModel.versionResult.observe(this) {
if (it.version.toInt() > BuildConfig.VERSION_CODE) {
@@ -371,9 +363,9 @@
}
})
- //安装
+ //安装。上传,然后存入本地库
installButton.setOnClickListener {
-
+ navigatePageTo()
}
//查看
@@ -678,6 +670,13 @@
override fun onResume() {
super.onResume()
mapView.onResume()
+ //协程异步显示默认数据
+ CoroutineScope(Dispatchers.Main).launch {
+ labelBeans = withContext(Dispatchers.IO) {
+ DataBaseManager.get.loadTaskLabels() as ArrayList
+ }
+ showLabelsOnMap()
+ }
}
override fun onPause() {
diff --git a/app/src/main/res/layout/activity_install_label.xml b/app/src/main/res/layout/activity_install_label.xml
index 06faaeb..10dfdc2 100644
--- a/app/src/main/res/layout/activity_install_label.xml
+++ b/app/src/main/res/layout/activity_install_label.xml
@@ -1,70 +1,113 @@
-
+ android:layout_height="wrap_content"
+ android:background="@color/mainBackground"
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="@dimen/lib_dp_45"
+ android:orientation="horizontal">
-
+
+ android:layout_width="@dimen/lib_px_1"
+ android:layout_height="match_parent"
+ android:background="@color/lib_line_color" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..c252d85
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt
index eaead98..cd06e07 100644
--- a/app/src/main/java/com/casic/detector/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt
@@ -157,14 +157,6 @@
progressDialog.setCanceledOnTouchOutside(false)
progressDialog.setCancelable(false)
- //协程异步显示默认数据
- CoroutineScope(Dispatchers.Main).launch {
- labelBeans = withContext(Dispatchers.IO) {
- DataBaseManager.get.loadTaskLabels() as ArrayList
- }
- showLabelsOnMap()
- }
-
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
versionViewModel.versionResult.observe(this) {
if (it.version.toInt() > BuildConfig.VERSION_CODE) {
@@ -371,9 +363,9 @@
}
})
- //安装
+ //安装。上传,然后存入本地库
installButton.setOnClickListener {
-
+ navigatePageTo()
}
//查看
@@ -678,6 +670,13 @@
override fun onResume() {
super.onResume()
mapView.onResume()
+ //协程异步显示默认数据
+ CoroutineScope(Dispatchers.Main).launch {
+ labelBeans = withContext(Dispatchers.IO) {
+ DataBaseManager.get.loadTaskLabels() as ArrayList
+ }
+ showLabelsOnMap()
+ }
}
override fun onPause() {
diff --git a/app/src/main/res/layout/activity_install_label.xml b/app/src/main/res/layout/activity_install_label.xml
index 06faaeb..10dfdc2 100644
--- a/app/src/main/res/layout/activity_install_label.xml
+++ b/app/src/main/res/layout/activity_install_label.xml
@@ -1,70 +1,113 @@
-
+ android:layout_height="wrap_content"
+ android:background="@color/mainBackground"
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="@dimen/lib_dp_45"
+ android:orientation="horizontal">
-
+
+ android:layout_width="@dimen/lib_px_1"
+ android:layout_height="match_parent"
+ android:background="@color/lib_line_color" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..c252d85
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_identifier.xml b/app/src/main/res/layout/include_install_label_identifier.xml
index 9af010d..87f0070 100644
--- a/app/src/main/res/layout/include_install_label_identifier.xml
+++ b/app/src/main/res/layout/include_install_label_identifier.xml
@@ -17,12 +17,9 @@
android:src="@mipmap/icon_summery" />
+ android:text="标识器属性" />
+ style="@style/textViewStyle"
+ android:text="ID号:" />
-
+
+ style="@style/textViewStyle"
+ android:text="类型:" />
+ android:id="@+id/identifierTypeSpinner"
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -135,28 +93,14 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="部门:" />
-
+
+ style="@style/textViewStyle"
+ android:text="时间:" />
-
+
+ style="@style/textViewStyle"
+ android:text="经度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="纬度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="颜色:" />
+ android:id="@+id/colorSpinner"
+ style="@style/spinnerStyle" />
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt
index eaead98..cd06e07 100644
--- a/app/src/main/java/com/casic/detector/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt
@@ -157,14 +157,6 @@
progressDialog.setCanceledOnTouchOutside(false)
progressDialog.setCancelable(false)
- //协程异步显示默认数据
- CoroutineScope(Dispatchers.Main).launch {
- labelBeans = withContext(Dispatchers.IO) {
- DataBaseManager.get.loadTaskLabels() as ArrayList
- }
- showLabelsOnMap()
- }
-
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
versionViewModel.versionResult.observe(this) {
if (it.version.toInt() > BuildConfig.VERSION_CODE) {
@@ -371,9 +363,9 @@
}
})
- //安装
+ //安装。上传,然后存入本地库
installButton.setOnClickListener {
-
+ navigatePageTo()
}
//查看
@@ -678,6 +670,13 @@
override fun onResume() {
super.onResume()
mapView.onResume()
+ //协程异步显示默认数据
+ CoroutineScope(Dispatchers.Main).launch {
+ labelBeans = withContext(Dispatchers.IO) {
+ DataBaseManager.get.loadTaskLabels() as ArrayList
+ }
+ showLabelsOnMap()
+ }
}
override fun onPause() {
diff --git a/app/src/main/res/layout/activity_install_label.xml b/app/src/main/res/layout/activity_install_label.xml
index 06faaeb..10dfdc2 100644
--- a/app/src/main/res/layout/activity_install_label.xml
+++ b/app/src/main/res/layout/activity_install_label.xml
@@ -1,70 +1,113 @@
-
+ android:layout_height="wrap_content"
+ android:background="@color/mainBackground"
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="@dimen/lib_dp_45"
+ android:orientation="horizontal">
-
+
+ android:layout_width="@dimen/lib_px_1"
+ android:layout_height="match_parent"
+ android:background="@color/lib_line_color" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..c252d85
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_identifier.xml b/app/src/main/res/layout/include_install_label_identifier.xml
index 9af010d..87f0070 100644
--- a/app/src/main/res/layout/include_install_label_identifier.xml
+++ b/app/src/main/res/layout/include_install_label_identifier.xml
@@ -17,12 +17,9 @@
android:src="@mipmap/icon_summery" />
+ android:text="标识器属性" />
+ style="@style/textViewStyle"
+ android:text="ID号:" />
-
+
+ style="@style/textViewStyle"
+ android:text="类型:" />
+ android:id="@+id/identifierTypeSpinner"
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -135,28 +93,14 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="部门:" />
-
+
+ style="@style/textViewStyle"
+ android:text="时间:" />
-
+
+ style="@style/textViewStyle"
+ android:text="经度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="纬度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="颜色:" />
+ android:id="@+id/colorSpinner"
+ style="@style/spinnerStyle" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_object.xml b/app/src/main/res/layout/include_install_label_object.xml
index a1d94c0..0b83938 100644
--- a/app/src/main/res/layout/include_install_label_object.xml
+++ b/app/src/main/res/layout/include_install_label_object.xml
@@ -13,16 +13,12 @@
+ android:text="标识对象属性" />
+ style="@style/textViewStyle"
+ android:text="对象种类:" />
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="类型:" />
-
+
+ style="@style/textViewStyle"
+ android:text="管材:" />
-
+
+ style="@style/textViewStyle"
+ android:text="管径:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -168,36 +112,22 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -208,28 +138,16 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="下层管种类:" />
-
+
+ style="@style/textViewStyle"
+ android:text="下层管材料:" />
-
+
+ style="@style/textViewStyle"
+ android:text="下层管直径:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -310,36 +202,22 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="下层管埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -350,28 +228,16 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="埋设方式:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属区域:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属线路:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属道路:" />
-
+
+ style="@style/textViewStyle"
+ android:text="建设年代:" />
-
+
+ style="@style/textViewStyle"
+ android:text="权属单位:" />
-
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt
index eaead98..cd06e07 100644
--- a/app/src/main/java/com/casic/detector/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt
@@ -157,14 +157,6 @@
progressDialog.setCanceledOnTouchOutside(false)
progressDialog.setCancelable(false)
- //协程异步显示默认数据
- CoroutineScope(Dispatchers.Main).launch {
- labelBeans = withContext(Dispatchers.IO) {
- DataBaseManager.get.loadTaskLabels() as ArrayList
- }
- showLabelsOnMap()
- }
-
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
versionViewModel.versionResult.observe(this) {
if (it.version.toInt() > BuildConfig.VERSION_CODE) {
@@ -371,9 +363,9 @@
}
})
- //安装
+ //安装。上传,然后存入本地库
installButton.setOnClickListener {
-
+ navigatePageTo()
}
//查看
@@ -678,6 +670,13 @@
override fun onResume() {
super.onResume()
mapView.onResume()
+ //协程异步显示默认数据
+ CoroutineScope(Dispatchers.Main).launch {
+ labelBeans = withContext(Dispatchers.IO) {
+ DataBaseManager.get.loadTaskLabels() as ArrayList
+ }
+ showLabelsOnMap()
+ }
}
override fun onPause() {
diff --git a/app/src/main/res/layout/activity_install_label.xml b/app/src/main/res/layout/activity_install_label.xml
index 06faaeb..10dfdc2 100644
--- a/app/src/main/res/layout/activity_install_label.xml
+++ b/app/src/main/res/layout/activity_install_label.xml
@@ -1,70 +1,113 @@
-
+ android:layout_height="wrap_content"
+ android:background="@color/mainBackground"
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="@dimen/lib_dp_45"
+ android:orientation="horizontal">
-
+
+ android:layout_width="@dimen/lib_px_1"
+ android:layout_height="match_parent"
+ android:background="@color/lib_line_color" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..c252d85
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_identifier.xml b/app/src/main/res/layout/include_install_label_identifier.xml
index 9af010d..87f0070 100644
--- a/app/src/main/res/layout/include_install_label_identifier.xml
+++ b/app/src/main/res/layout/include_install_label_identifier.xml
@@ -17,12 +17,9 @@
android:src="@mipmap/icon_summery" />
+ android:text="标识器属性" />
+ style="@style/textViewStyle"
+ android:text="ID号:" />
-
+
+ style="@style/textViewStyle"
+ android:text="类型:" />
+ android:id="@+id/identifierTypeSpinner"
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -135,28 +93,14 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="部门:" />
-
+
+ style="@style/textViewStyle"
+ android:text="时间:" />
-
+
+ style="@style/textViewStyle"
+ android:text="经度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="纬度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="颜色:" />
+ android:id="@+id/colorSpinner"
+ style="@style/spinnerStyle" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_object.xml b/app/src/main/res/layout/include_install_label_object.xml
index a1d94c0..0b83938 100644
--- a/app/src/main/res/layout/include_install_label_object.xml
+++ b/app/src/main/res/layout/include_install_label_object.xml
@@ -13,16 +13,12 @@
+ android:text="标识对象属性" />
+ style="@style/textViewStyle"
+ android:text="对象种类:" />
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="类型:" />
-
+
+ style="@style/textViewStyle"
+ android:text="管材:" />
-
+
+ style="@style/textViewStyle"
+ android:text="管径:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -168,36 +112,22 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -208,28 +138,16 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="下层管种类:" />
-
+
+ style="@style/textViewStyle"
+ android:text="下层管材料:" />
-
+
+ style="@style/textViewStyle"
+ android:text="下层管直径:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -310,36 +202,22 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="下层管埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -350,28 +228,16 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="埋设方式:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属区域:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属线路:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属道路:" />
-
+
+ style="@style/textViewStyle"
+ android:text="建设年代:" />
-
+
+ style="@style/textViewStyle"
+ android:text="权属单位:" />
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_open_camera.xml b/app/src/main/res/layout/include_install_label_open_camera.xml
index c7fa765..39f3242 100644
--- a/app/src/main/res/layout/include_install_label_open_camera.xml
+++ b/app/src/main/res/layout/include_install_label_open_camera.xml
@@ -18,11 +18,9 @@
android:src="@mipmap/icon4" />
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt
index eaead98..cd06e07 100644
--- a/app/src/main/java/com/casic/detector/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt
@@ -157,14 +157,6 @@
progressDialog.setCanceledOnTouchOutside(false)
progressDialog.setCancelable(false)
- //协程异步显示默认数据
- CoroutineScope(Dispatchers.Main).launch {
- labelBeans = withContext(Dispatchers.IO) {
- DataBaseManager.get.loadTaskLabels() as ArrayList
- }
- showLabelsOnMap()
- }
-
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
versionViewModel.versionResult.observe(this) {
if (it.version.toInt() > BuildConfig.VERSION_CODE) {
@@ -371,9 +363,9 @@
}
})
- //安装
+ //安装。上传,然后存入本地库
installButton.setOnClickListener {
-
+ navigatePageTo()
}
//查看
@@ -678,6 +670,13 @@
override fun onResume() {
super.onResume()
mapView.onResume()
+ //协程异步显示默认数据
+ CoroutineScope(Dispatchers.Main).launch {
+ labelBeans = withContext(Dispatchers.IO) {
+ DataBaseManager.get.loadTaskLabels() as ArrayList
+ }
+ showLabelsOnMap()
+ }
}
override fun onPause() {
diff --git a/app/src/main/res/layout/activity_install_label.xml b/app/src/main/res/layout/activity_install_label.xml
index 06faaeb..10dfdc2 100644
--- a/app/src/main/res/layout/activity_install_label.xml
+++ b/app/src/main/res/layout/activity_install_label.xml
@@ -1,70 +1,113 @@
-
+ android:layout_height="wrap_content"
+ android:background="@color/mainBackground"
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="@dimen/lib_dp_45"
+ android:orientation="horizontal">
-
+
+ android:layout_width="@dimen/lib_px_1"
+ android:layout_height="match_parent"
+ android:background="@color/lib_line_color" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..c252d85
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_identifier.xml b/app/src/main/res/layout/include_install_label_identifier.xml
index 9af010d..87f0070 100644
--- a/app/src/main/res/layout/include_install_label_identifier.xml
+++ b/app/src/main/res/layout/include_install_label_identifier.xml
@@ -17,12 +17,9 @@
android:src="@mipmap/icon_summery" />
+ android:text="标识器属性" />
+ style="@style/textViewStyle"
+ android:text="ID号:" />
-
+
+ style="@style/textViewStyle"
+ android:text="类型:" />
+ android:id="@+id/identifierTypeSpinner"
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -135,28 +93,14 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="部门:" />
-
+
+ style="@style/textViewStyle"
+ android:text="时间:" />
-
+
+ style="@style/textViewStyle"
+ android:text="经度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="纬度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="颜色:" />
+ android:id="@+id/colorSpinner"
+ style="@style/spinnerStyle" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_object.xml b/app/src/main/res/layout/include_install_label_object.xml
index a1d94c0..0b83938 100644
--- a/app/src/main/res/layout/include_install_label_object.xml
+++ b/app/src/main/res/layout/include_install_label_object.xml
@@ -13,16 +13,12 @@
+ android:text="标识对象属性" />
+ style="@style/textViewStyle"
+ android:text="对象种类:" />
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="类型:" />
-
+
+ style="@style/textViewStyle"
+ android:text="管材:" />
-
+
+ style="@style/textViewStyle"
+ android:text="管径:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -168,36 +112,22 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -208,28 +138,16 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="下层管种类:" />
-
+
+ style="@style/textViewStyle"
+ android:text="下层管材料:" />
-
+
+ style="@style/textViewStyle"
+ android:text="下层管直径:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -310,36 +202,22 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="下层管埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -350,28 +228,16 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="埋设方式:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属区域:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属线路:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属道路:" />
-
+
+ style="@style/textViewStyle"
+ android:text="建设年代:" />
-
+
+ style="@style/textViewStyle"
+ android:text="权属单位:" />
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_open_camera.xml b/app/src/main/res/layout/include_install_label_open_camera.xml
index c7fa765..39f3242 100644
--- a/app/src/main/res/layout/include_install_label_open_camera.xml
+++ b/app/src/main/res/layout/include_install_label_open_camera.xml
@@ -18,11 +18,9 @@
android:src="@mipmap/icon4" />
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 8ff798d..91839d5 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -12,7 +12,7 @@
#FF09BB07
#008CFF
#803d7eff
- #FFF5F5F5
+ #FFF8F8F8
#80F5F5F5
#D8D8D8
#37D4AE
diff --git a/app/build.gradle b/app/build.gradle
index b3cd0c8..3ad10f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -99,4 +99,12 @@
implementation 'com.amap.api:search:8.1.0'
//excel
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //单项/数字、二三级联动、日期/时间等滚轮选择器
+ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6114ede..13af612 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,7 @@
+
diff --git a/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
new file mode 100644
index 0000000..731c02b
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/DateSelectedCallback.kt
@@ -0,0 +1,5 @@
+package com.casic.detector.callback
+
+interface DateSelectedCallback {
+ fun onDateSelected(date: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
new file mode 100644
index 0000000..6a0f91d
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnImageCompressListener.kt
@@ -0,0 +1,15 @@
+package com.casic.detector.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/detector/callback/OnItemSelectedListener.kt b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
new file mode 100644
index 0000000..536d95e
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/callback/OnItemSelectedListener.kt
@@ -0,0 +1,7 @@
+package com.casic.detector.callback
+
+interface OnItemSelectedListener {
+ fun defaultSelection(default: String)
+
+ fun onItemSelected(value: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Activity.kt b/app/src/main/java/com/casic/detector/extensions/Activity.kt
new file mode 100644
index 0000000..e2027d8
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Activity.kt
@@ -0,0 +1,43 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import com.casic.detector.R
+import com.casic.detector.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(14f.sp2px(this).toFloat())
+ layout.setSelectedTextSize(16f.sp2px(this).toFloat())
+ layout.setSelectedTextColor(R.color.themeColor.convertColor(this))
+ layout.setSelectedTextBold(true)
+ layout.setResetWhenLinkage(false)
+ layout.setRange(
+ start,
+ DateEntity.target(2050, 12, 31),
+ DateEntity.today()
+ )
+
+ datePicker.setOnDatePickedListener { year, month, day ->
+ val m = if (month < 10) {
+ "0${month}"
+ } else {
+ month
+ }
+ val d = if (day < 10) {
+ "0${day}"
+ } else {
+ day
+ }
+ callback.onDateSelected(String.format("%s-%s-%s", year, m, d))
+ }
+ datePicker.show()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/Spinner.kt b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
new file mode 100644
index 0000000..2e24e90
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/extensions/Spinner.kt
@@ -0,0 +1,27 @@
+package com.casic.detector.extensions
+
+import android.app.Activity
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import com.casic.detector.callback.OnItemSelectedListener
+
+fun Spinner.show(
+ activity: Activity, items: Array, default: Int, listener: OnItemSelectedListener
+) {
+ this.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, items)
+ this.setSelection(default)
+ listener.defaultSelection(items[default])
+ this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ adapterView: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ listener.onItemSelected(items[position])
+ }
+
+ override fun onNothingSelected(p0: AdapterView<*>?) {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/extensions/String.kt b/app/src/main/java/com/casic/detector/extensions/String.kt
index 156d10e..7352dc1 100644
--- a/app/src/main/java/com/casic/detector/extensions/String.kt
+++ b/app/src/main/java/com/casic/detector/extensions/String.kt
@@ -1,12 +1,18 @@
package com.casic.detector.extensions
+import android.content.Context
+import com.casic.detector.callback.OnImageCompressListener
import com.casic.detector.model.ErrorMessageModel
import com.casic.detector.utils.FileType
import com.casic.detector.utils.LocaleConstant
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.pengxh.kt.lite.extensions.createCompressImageDir
import com.pengxh.kt.lite.utils.SaveKeyValues
import org.json.JSONObject
+import top.zibin.luban.Luban
+import top.zibin.luban.OnCompressListener
+import java.io.File
/**
* String扩展方法
@@ -37,4 +43,24 @@
FileType.APK -> "$httpConfig/ems/${this}"
FileType.EXCEL -> "$httpConfig/ems/xls/marker${this}.xls"
}
+}
+
+fun String.compressImage(context: Context, listener: OnImageCompressListener) {
+ Luban.with(context)
+ .load(this)
+ .ignoreBy(100)
+ .setTargetDir(context.createCompressImageDir().toString())
+ .setCompressListener(object : OnCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(file: File) {
+ listener.onSuccess(file)
+ }
+
+ override fun onError(e: Throwable) {
+ listener.onError(e)
+ }
+ }).launch()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
index 9fb1c87..5bb7fbe 100644
--- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt
@@ -29,4 +29,9 @@
val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全")
var POINT_TYPE_ARRAY = arrayOf("", "管线", "管线附属物", "管线特征管点", "交叉穿越点")
var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注")
+ var PIPE_MATERIAL_ARRAY = arrayOf("", "铸铁", "塑料")
+ var DOWN_PIPE_TYPE_ARRAY = arrayOf("", "热力", "燃气", "供水", "电力", "通信")
+ var BURY_METHOD_ARRAY = arrayOf("", "直埋", "圆管", "管块", "管沟", "架空")
+ var IDENTIFIER_TYPE_ARRAY = arrayOf("EM30", "EM50", "EM14")
+ var COLOR_ARRAY = arrayOf("蓝色", "橙色", "红色", "黑色", "紫色", "黄色", "绿色")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
new file mode 100644
index 0000000..d61bec9
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/view/InstallLabelActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.detector.view
+
+import android.content.Context
+import android.view.View
+import com.amap.api.location.AMapLocation
+import com.casic.detector.R
+import com.casic.detector.callback.DateSelectedCallback
+import com.casic.detector.callback.ILocationListener
+import com.casic.detector.callback.OnImageCompressListener
+import com.casic.detector.callback.OnItemSelectedListener
+import com.casic.detector.extensions.compressImage
+import com.casic.detector.extensions.initLayoutImmersionBar
+import com.casic.detector.extensions.show
+import com.casic.detector.extensions.showDatePicker
+import com.casic.detector.utils.LocaleConstant
+import com.casic.detector.utils.LocationHub
+import com.github.gzuliyujiang.wheelpicker.entity.DateEntity
+import com.gyf.immersionbar.ImmersionBar
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.extensions.timestampToCompleteDate
+import kotlinx.android.synthetic.main.activity_install_label.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_install_label_identifier.*
+import kotlinx.android.synthetic.main.include_install_label_object.*
+import kotlinx.android.synthetic.main.include_install_label_open_camera.*
+import java.io.File
+
+class InstallLabelActivity : KotlinBaseActivity() {
+
+ private val kTag = "InstallLabelActivity"
+ private val context: Context = this@InstallLabelActivity
+ private lateinit var imageAdapter: EditableImageAdapter
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+ private var objectTypeSelectedItem = ""
+ private var materialSelectedItem = ""
+ private var downPipeSelectedItem = ""
+ private var downPipeMaterialSelectedItem = ""
+ private var buryMethodSelectedItem = ""
+ private var identifierTypeSelectedItem = ""
+ private var colorSelectedItem = ""
+
+ override fun initData() {
+ imageAdapter = EditableImageAdapter(this, 3, 3f)
+ addImageRecyclerView.adapter = imageAdapter
+ }
+
+ override fun initEvent() {
+ leftBackView.setOnClickListener { finish() }
+
+ /**************************************************************************************/
+ objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ objectTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ objectTypeSelectedItem = value
+ }
+ })
+
+ materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ materialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ materialSelectedItem = value
+ }
+ })
+
+ downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeSelectedItem = value
+ }
+ })
+
+ downPipeMaterialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ downPipeMaterialSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ downPipeMaterialSelectedItem = value
+ }
+ })
+
+ buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 1,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ buryMethodSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ buryMethodSelectedItem = value
+ }
+ })
+
+ constructDateView.setOnClickListener {
+ showDatePicker(DateEntity.today(), object : DateSelectedCallback {
+ override fun onDateSelected(date: String) {
+ constructDateView.text = date
+ }
+ })
+ }
+
+ identifierTypeSpinner.show(this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0,
+ object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ identifierTypeSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ identifierTypeSelectedItem = value
+ }
+ })
+
+ installTimeView.text = System.currentTimeMillis().timestampToCompleteDate()
+ LocationHub.getCurrentLocation(this, object : ILocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ if (location != null) {
+ lngView.text = location.longitude.toString()
+ latView.text = location.latitude.toString()
+ } else {
+ "当前位置信号差,无法获取定位".show(context)
+ }
+ }
+ })
+
+ colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0, object : OnItemSelectedListener {
+ override fun defaultSelection(default: String) {
+ colorSelectedItem = default
+ }
+
+ override fun onItemSelected(value: String) {
+ colorSelectedItem = value
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ takePicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show(context)
+ } else {
+// context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ /**************************************************************************************/
+ }
+
+ private fun takePicture() {
+ PictureSelector.create(this).openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照失败,请重试".show(context)
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片后上传
+ result.realPath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ //上传图片
+// fileUploadViewModel.uploadFile(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_install_label
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ titleView.text = "安装新标识器"
+ titleView.setTextColor(R.color.themeColor.convertColor(this))
+
+ ImmersionBar.with(this)
+ .statusBarDarkFont(true)
+ .statusBarColor(R.color.mainBackground)
+ .init()
+ initLayoutImmersionBar(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt
index eaead98..cd06e07 100644
--- a/app/src/main/java/com/casic/detector/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt
@@ -157,14 +157,6 @@
progressDialog.setCanceledOnTouchOutside(false)
progressDialog.setCancelable(false)
- //协程异步显示默认数据
- CoroutineScope(Dispatchers.Main).launch {
- labelBeans = withContext(Dispatchers.IO) {
- DataBaseManager.get.loadTaskLabels() as ArrayList
- }
- showLabelsOnMap()
- }
-
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
versionViewModel.versionResult.observe(this) {
if (it.version.toInt() > BuildConfig.VERSION_CODE) {
@@ -371,9 +363,9 @@
}
})
- //安装
+ //安装。上传,然后存入本地库
installButton.setOnClickListener {
-
+ navigatePageTo()
}
//查看
@@ -678,6 +670,13 @@
override fun onResume() {
super.onResume()
mapView.onResume()
+ //协程异步显示默认数据
+ CoroutineScope(Dispatchers.Main).launch {
+ labelBeans = withContext(Dispatchers.IO) {
+ DataBaseManager.get.loadTaskLabels() as ArrayList
+ }
+ showLabelsOnMap()
+ }
}
override fun onPause() {
diff --git a/app/src/main/res/layout/activity_install_label.xml b/app/src/main/res/layout/activity_install_label.xml
index 06faaeb..10dfdc2 100644
--- a/app/src/main/res/layout/activity_install_label.xml
+++ b/app/src/main/res/layout/activity_install_label.xml
@@ -1,70 +1,113 @@
-
+ android:layout_height="wrap_content"
+ android:background="@color/mainBackground"
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="@dimen/lib_dp_45"
+ android:orientation="horizontal">
-
+
+ android:layout_width="@dimen/lib_px_1"
+ android:layout_height="match_parent"
+ android:background="@color/lib_line_color" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..c252d85
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_identifier.xml b/app/src/main/res/layout/include_install_label_identifier.xml
index 9af010d..87f0070 100644
--- a/app/src/main/res/layout/include_install_label_identifier.xml
+++ b/app/src/main/res/layout/include_install_label_identifier.xml
@@ -17,12 +17,9 @@
android:src="@mipmap/icon_summery" />
+ android:text="标识器属性" />
+ style="@style/textViewStyle"
+ android:text="ID号:" />
-
+
+ style="@style/textViewStyle"
+ android:text="类型:" />
+ android:id="@+id/identifierTypeSpinner"
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -135,28 +93,14 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="部门:" />
-
+
+ style="@style/textViewStyle"
+ android:text="时间:" />
-
+
+ style="@style/textViewStyle"
+ android:text="经度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="纬度:" />
-
+
+ style="@style/textViewStyle"
+ android:text="颜色:" />
+ android:id="@+id/colorSpinner"
+ style="@style/spinnerStyle" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_object.xml b/app/src/main/res/layout/include_install_label_object.xml
index a1d94c0..0b83938 100644
--- a/app/src/main/res/layout/include_install_label_object.xml
+++ b/app/src/main/res/layout/include_install_label_object.xml
@@ -13,16 +13,12 @@
+ android:text="标识对象属性" />
+ style="@style/textViewStyle"
+ android:text="对象种类:" />
+ style="@style/spinnerStyle" />
+ style="@style/textViewStyle"
+ android:text="类型:" />
-
+
+ style="@style/textViewStyle"
+ android:text="管材:" />
-
+
+ style="@style/textViewStyle"
+ android:text="管径:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -168,36 +112,22 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -208,28 +138,16 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="下层管种类:" />
-
+
+ style="@style/textViewStyle"
+ android:text="下层管材料:" />
-
+
+ style="@style/textViewStyle"
+ android:text="下层管直径:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -310,36 +202,22 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="下层管埋深:" />
+ style="@style/inputEditTextStyle"
+ android:inputType="numberDecimal" />
@@ -350,28 +228,16 @@
android:orientation="horizontal">
+ style="@style/textViewStyle"
+ android:text="埋设方式:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属区域:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属线路:" />
-
+
+ style="@style/textViewStyle"
+ android:text="所属道路:" />
-
+
+ style="@style/textViewStyle"
+ android:text="建设年代:" />
-
+
+ style="@style/textViewStyle"
+ android:text="权属单位:" />
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_install_label_open_camera.xml b/app/src/main/res/layout/include_install_label_open_camera.xml
index c7fa765..39f3242 100644
--- a/app/src/main/res/layout/include_install_label_open_camera.xml
+++ b/app/src/main/res/layout/include_install_label_open_camera.xml
@@ -18,11 +18,9 @@
android:src="@mipmap/icon4" />
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 8ff798d..91839d5 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -12,7 +12,7 @@
#FF09BB07
#008CFF
#803d7eff
- #FFF5F5F5
+ #FFF8F8F8
#80F5F5F5
#D8D8D8
#37D4AE
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 42fe092..620772b 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -9,44 +9,6 @@
- @drawable/button_main_selector
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
\ No newline at end of file