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"> - +